C++ VisualStudio和gcc之间*.dll*.a*.lib*.def的兼容性

C++ VisualStudio和gcc之间*.dll*.a*.lib*.def的兼容性,c++,qt,visual-c++,gcc,mingw,C++,Qt,Visual C++,Gcc,Mingw,这很令人困惑。我花了很多时间阅读关于这个堆栈的帖子,等等,仍然感到困惑 我使用QT和C++进行编码。在Qt中,我将gcc选项用于编译器。 问题是,我尝试过的许多第三方库似乎都不起作用 我不熟悉.dll、.a、.lib、.def文件和库方案 问题1: 根据我有限的经验(到目前为止我已经尝试了7或9个库),库的供应商很少告诉您.dll是用VisualStudio还是gcc制作的。这增加了很多混乱。他们几乎从来没有弄清楚库与什么编译器兼容。所以我会很感激一些关于如何处理这场噩梦的现实生活提示。我尝试的

这很令人困惑。我花了很多时间阅读关于这个堆栈的帖子,等等,仍然感到困惑

我使用QT和C++进行编码。在Qt中,我将gcc选项用于编译器。
问题是,我尝试过的许多第三方库似乎都不起作用

我不熟悉.dll、.a、.lib、.def文件和库方案

问题1:

根据我有限的经验(到目前为止我已经尝试了7或9个库),库的供应商很少告诉您.dll是用VisualStudio还是gcc制作的。这增加了很多混乱。他们几乎从来没有弄清楚库与什么编译器兼容。所以我会很感激一些关于如何处理这场噩梦的现实生活提示。我尝试的几乎所有库都是开源项目。我不会在这里指名道姓,但这些都是众所周知的项目。我确信问题是我缺乏知识

MinGW和gcc世界

问题2:
据我所知,MIWW GCC宇宙的动态C++库需要这些,对吗? *.h
*.dll
*.a

问题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:
在使用MinGW/gcc的Qt项目中使用*.dll不需要*.def文件,对吗

VisualStudio World

问题9:
据我所知,VisualStudio的动态C++库需要: *.h
*.dll
*lib先生

对吧??同样,问题是*.lib文件几乎总是丢失。另外,没有关于库与什么编译器兼容的明确说明。那么,我如何知道它是否仅适用于VisualStudio

问题10:
如果.lib文件丢失,我是不是运气不好

问题11:
如果*.dll是用VisualStudio创建的,我可以为VisualStudio生成.lib文件吗?怎么做

问题12:
如果*.dll是用MinGW/gcc创建的,我可以为VisualStudio生成.lib文件吗?怎么做

问题13:
是否有可能*.dll(由VisualStudio制作)太旧,不再与较新的VisualStudio兼容

问题14:
如果我在QtCreator中选择VisualStudio编译器,它是否与其他人使用REAL VisualStudio编译的动态库100%兼容?我相信Qt Creator中的VisualStudio编译器选项是假的VisualStudio编译器

问题15:
如果在QtCreator中我选择了MinGW/gcc编译器,我可以使用其他人使用REAL VisualStudio编译的Qt动态库吗

问题16:
在使用MinGW/gcc的Qt项目中使用*.dll不需要*.def文件,对吗

问题17:
我可以将使用REAL VisualStudio制作的*lib(可与*.dll和*.h一起使用)文件转换为*.a文件吗?这样我就可以在Qt gcc项目中使用带有未修改的*.dll的*.a文件和*.h文件了?

dll本质上是一个已编译的应用程序,只是以函数库的形式,而不是EXE文件。任何其他应用程序都可以通过声明函数、包含函数的DLL以及参数和返回值等来使用该DLL中的函数

如果应用程序是使用“动态链接库”编译的,则DLL必须已经存在于系统上,因此您必须在安装程序中包含必要的DLL,或者希望它们已经存在于目标计算机上。使用DLL使应用程序的大小总体上变小

创建DLL就像创建任何其他应用程序一样——您只需将构建作为DLL,而不是EXE或其他任何程序

要创建任何应用程序(DLL、EXE或其他),您需要必要的源代码和标题。h文件包含函数、数据类型、类等的声明——它们很少包含代码。def很像A.h,但通常是链接器的一组指令

编译时,.h或.c或任何东西都会变成.obj—一个对象文件。多个对象文件链接在一起以创建DLL或EXE

lib文件是一个静态库-本质上是一组.obj文件(或一个.obj文件),它们已组合用于链接阶段

.obj和.lib文件的格式可能是特定于编译器的,并且它们很少在编译器之间兼容。您必须拥有原始源代码,或专门为编译器制作的.obj或.lib


当您选择使用“动态链接库”创建EXE时,它将期望使用DLL。当您选择“静态链接库”时,链接器将在生成EXE之前找到它所需的.lib文件,而您将不需要这些DLL。

也许值得从一开始就开始,而不是先发制人地描述核心问题。由此可以得出几个问题的答案

首先是ABI(应用程序二进制接口)。这就定义了

  • 函数的调用方式,例如,哪些参数进入哪个寄存器或它们放在堆栈上的哪个位置
  • 如何抛出异常
  • 对象的布局方式,例如“vtable指针”的位置、使用的填充
  • 内置数据类型有多大
  • 函数名是如何“扭曲”成符号的
  • 类型信息的布局方式
  • 标准库类的布局
  • 等等
大多数平台都定义了C ABI,但没有定义
set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH%

dlltool.exe -d libfftw3-3.def -l libfftw3-3.a
set PATH=C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;%PATH%

lib /machine:x86 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3-3.def