*.dll *的兼容性.一个*.VisualStudio和gcc之间的lib *.def
Compatibility of *.dll *.a *.lib *.def between VisualStudio and gcc
这很令人困惑。我花了很多时间阅读这方面的文章。仍然困惑。
我使用Qt和c++进行编码。在Qt中,我使用gcc选项作为编译器。问题是我尝试过的许多第三方库似乎都不起作用。
我是新的。dll, .a, .lib, .def文件和库方案。
问题1:
在我有限的经验中(到目前为止我已经尝试了7或9个库),库的供应商很少告诉你。dll是用VisualStudio还是gcc制作的。这增加了很多困惑。他们几乎从不说明库与哪个编译器兼容。所以我希望你能给我一些现实生活中如何应对这种噩梦的建议。我尝试过的几乎所有库都是开源项目。我不会在这里指名道姓,但这些都是众所周知的项目。我敢肯定问题出在我知识的缺乏上。
MinGW and gcc World
问题2:
据我所知,MinGW gcc宇宙的动态c++库需要这些,对吗?
* . h
* . dll
*。
问题3:
不幸的是,.a文件经常丢失,库无法工作。这很令人困惑。如果。a文件丢失了,我是不是很不幸?
问题4:
如果*.dll是用gcc制作的,我可以为MinGW/gcc生成。a文件吗?
问题5:如果*.dll是用VisualStudio制作的,我可以为MinGW/gcc生成。a文件吗?
问题6:
是否有可能,一个*.dll(与MinGW/gcc)是太旧,不再与较新的MinGW/gcc兼容?
问题7:
使用MinGW/gcc的Qt项目从不需要*。Lib文件,对吧?这是VisualStudio独有的功能,对吧?
问题8:
我不需要一个*.def文件在使用MinGW/gcc的Qt项目中使用*.dll,对吧?
VisualStudio World
问题9:
据我所知,VisualStudio的动态c++库需要这些:
* . h
* . dll
*。自由
对吧?同样,问题是*。Lib文件几乎总是丢失。另外,没有关于库与哪个编译器兼容的明确说明。那么我怎么知道它是否只适用于VisualStudio呢?
问题10:
如果.lib文件丢失,我运气不好吗?
问题11:
如果*.dll是用VisualStudio制作的,我可以为VisualStudio生成。lib文件吗?如何?
如果*.dll是用MinGW/gcc制作的,我可以为VisualStudio生成。lib文件吗?如何?
是否有可能,*.dll(与VisualStudio制作)太旧,不再与较新的VisualStudio兼容?
如果在QtCreator我选择VisualStudio编译器,是100%兼容动态库与真正的VisualStudio由别人编译?我相信Qt Creator中的VisualStudio编译器选项是一个假的VisualStudio编译器。
问题15:
如果在QtCreator我选择MinGW/gcc编译器,我可以使用Qt动态库与REAL VisualStudio由别人编译?
问题16:
我不需要一个*.def文件在使用MinGW/gcc的Qt项目中使用*.dll,对吧?
问题17:我可以转换一个*lib(与*.dll和*.h一起工作)文件与REAL VisualStudio到一个*。一个文件,所以我可以使用*。一个文件与未修改的*.dll,和*.h文件在Qt gcc项目?
也许值得从头开始,而不是跳过我们自己并描述核心问题。由此可以得出若干问题的答案。
开头是ABI(应用程序二进制接口)。它定义了像
这样的内容- 函数如何被调用,例如,哪些参数进入哪个寄存器,或者它们放在堆栈的哪个位置
- 如何抛出异常
- 对象如何布局,例如"虚表指针"的位置,使用什么填充
- 内置数据类型有多大
- 函数名如何被"扭曲"成符号
- 类型信息如何布局
- 标准库类布局
- 等。
大多数平台定义了C ABI,但是没有定义c++ ABI。因此,编译器定义了自己的ABI(除了通常存在的C语言之外的所有东西)。这会产生不同编译器(有时甚至是同一编译器的不同版本)之间不兼容的目标文件。
通常,这表现在奇怪的名字在某种程度上是未定义的:不同的abi故意使用不同的名称混淆来防止意外地链接一个无论如何都不能工作的可执行文件。要解决这些问题,最好的办法是使用相同的编译器构建所有组件。
如果您想确定一个库是用哪个编译器构建的,您可以使用适当的工具查看它的内容。我知道你问的是Windows,但我只知道UNIX工具(它们可能与MingW一起可用):
- nm查看符号名称(通常与less或grep一起)
- 创建或检查库
- 标识符查找嵌入在对象 中的特殊字符串
- 字符串显示所有字符串
- c++ filts将符号插入其c++声明
查看这些符号通常可以识别出是哪个编译器产生了它们。如果您经常看到它们,您甚至可以从符号本身分辨出ABI。
有很多在这个地区,但我已经耗尽了体力…无论如何,我认为这回答了上面的几个问题。
我在搜索工具时偶然发现了这个问题,该工具用于使用windows的Code::Blocks c++编译器创建.a文件。代码:块使用MinGW gcc编译器。我想它在谷歌上的排名足以证明我的巫术。
动态链接库(dll)是一个混合的束。有些编译方式使得它们很难在创建它们时使用的编程语言和编译器之外使用。
然而,dll通常是用一个干净的C接口创建的。在这种情况下,我认为我可以回答你的问题的答案是:1:这不是一个问题。
2、9:yes
3、10:no
4,11:是的。MinGW包含一个工具(dlltool.exe),它接受一个。dll和一个。def文件并创建一个。a文件MS VisualStudio还包括一个工具(我认为是lib.exe)来做同样的事情。如果你开始使用另一个编译器,你可能会发现他们也有一个工具。Borlands编译器有implib.exe工具。
5、12:yes(同4)
6,13:皮尤……我不认为dll有一个截止日期,但它们必须为正确的操作系统编译。
8,16:你需要。def来创建。a或。lib,如果你没有它,实际上可以从。dll
DLL本质上是一个编译过的应用程序-只是以函数库的形式而不是EXE文件的形式。任何其他应用程序都可以通过声明该函数、包含该函数的DLL、参数和返回值等来使用该DLL中的函数。
如果应用程序是使用"动态链接库"编译的,那么dll必须已经存在于系统中,因此您必须在安装程序中包含必要的dll,或者希望它们已经存在于目标计算机上。使用dll使你的应用程序的大小更小。
创建DLL就像创建任何其他应用程序一样-您只需将构建作为DLL而不是EXE或其他。
要创建任何应用程序- DLL, EXE或其他-你需要必要的源代码和头文件。h文件包含函数和数据类型和类等的声明-它们很少包含代码。.def很像。h,但通常是链接器的一组指令。
当你编译时,一个。h或。c或其他什么会变成一个。obj——一个目标文件。多个目标文件链接在一起以创建您的DLL或EXE。
.lib文件是一个静态库——本质上是一堆.obj文件(或一个.obj),它们在链接阶段被组合在一起。
.obj和.lib文件的格式可能是特定于编译器的,并且它们很少在编译器之间兼容。您必须有原始的源代码,或者专门为您的编译器制作的。obj或。lib。
当你选择用"动态链接库"制作EXE时,它将期待它可以使用的dll。当您选择"静态链接库"时,链接器将在生成EXE之前找到所需的.lib文件,而您将不需要这些dll。
问题1:您应该导入.h
文件并使用linkker命令链接.a
文件,并将.dll
复制到.exe
输出附近。
问题2:你可以通过.def
文件制作.a
文件
set PATH=C:Program FilesCodeBlocksMinGWbin;%PATH%
dlltool.exe -d libfftw3-3.def -l libfftw3-3.a
问题3:没有。可以先手工制作.def
文件,然后再制作.a
文件。
问题4,5:是
问题6:我认为这取决于你的硬件和操作系统,而不是编译器。
问题7:我不知道。
问题8:你只需要.h
.a
.dll
不需要。def
问题9:.lib
文件是用于visual studio的。
问题10:不,你需要.def
和.dll
来制造.lib
,如果你没有. def
,你可以自己制造。
set PATH=C:Program FilesMicrosoft Visual Studio 12.0VCbin;%PATH%
lib /machine:x86 /def:libfftw3-3.def
或
lib /machine:x64 /def:libfftw3-3.def
问题11:yes i told you above.
问题12:yes
问题13:no
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- *.dll *的兼容性.一个*.VisualStudio和gcc之间的lib *.def