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

时间:2011-12-30 19:10:15

标签: c++ qt visual-c++ gcc mingw

这是非常令人困惑的。我花了很多时间在堆栈上阅读帖子,等等。仍然很困惑。

我正在使用Qt和C ++进行编码。在Qt中,我使用gcc选项编译器 问题是我尝试过的许多第三方图书馆似乎都没有用。

我是.dll,.a,.lib,.def文件和库方案的新手。

问题1:

在我有限的经验中(到目前为止我已经尝试了7或9个库),图书馆的供应商很少告诉你.dll是用VisualStudio还是用gcc制作的。这增加了很多困惑。他们几乎从不清楚库兼容的编译器。所以我很欣赏一些如何应对这场噩梦的真实生活技巧。我尝试过的几乎所有库都是OpenSource项目。我不会在这里命名,但这些都是众所周知的项目。我确定问题是我缺乏知识......

MinGW和gcc World

问题2:
据我所知,MinGW gcc Universe的动态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:
我不需要* .def文件在使用MinGW / gcc的Qt项目中使用* .dll,对吧?

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

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

4 个答案:

答案 0 :(得分:15)

也许值得从一开始就开始,而不是超越自己并描述核心问题。从这个答案可以得出几个问题。

开始是ABI(应用程序二进制接口)。这定义了像

这样的东西
  • 如何调用函数,例如哪些参数进入哪些寄存器或它们放在堆栈上的哪个位置
  • 如何抛出异常
  • 如何布置物体,例如“vtable指针”的位置,使用了什么填充
  • 内置数据类型有多大
  • 函数名称如何“损坏”成符号
  • 如何列出类型信息
  • 标准库类的布局

大多数平台定义C ABI但定义C ++ ABI。结果编译器定义了他们自己的ABI(除了通常存在的C之外的所有东西)。这会产生在不同编译器之间不兼容的目标文件(有时甚至在同一编译器的版本之间)。

通常情况下,这表现为看起来很奇怪的名字,某种程度上是未定义的:不同的ABI故意使用不同的名称修改来防止意外链接无法正常工作的可执行文件。要解决这些问题,最好的办法是使用相同的编译器构建所有组件。

如果要确定构建库的编译器,可以使用适当的工具查看其内容。我意识到你问过Windows,但我只知道UNIX工具(它们可能与MingW一起提供):

  • nm查看符号名称(通常与less或grep一起)
  • 建立或检查图书馆
  • ident以查找嵌入在对象中的特殊字符串
  • 字符串以喜欢所有字符串
  • c ++ filt将符号解码为C ++声明

查看这些符号通常会产生编译器生成它们的标识。如果你经常看到它们,你甚至可以从符号本身告诉ABI。

这方面还有很多,但我的耐力已经耗尽了...... :-)无论如何,我认为这回答了上述几个问题。

答案 1 :(得分:7)

在使用Code :: Blocks c ++编译器for windows搜索用于创建.a文件的工具时,我偶然发现了这个问题。代码:Blocks使用MinGW gcc编译器。我认为谷歌足够高,可以验证我的死灵法。

动态链接库(dll)是混合的。有些可以编译,使得它们很难在编程语言和创建它们的编译器之外使用。

然而,通常使用干净的C接口创建dll。在这种情况下,我认为我能回答的问题的答案是:

1:这不是问题。

2,9:是的

3,10:没有

4,11:是的。 MinGW包含一个工具(dlltool.exe),它接受.dll和.def文件并创建.a文件 MS VisualStudio还包含一个工具(我认为称为lib.exe)来做同样的事情。 如果你开始使用另一个编译器,你可能会发现他们也有一个工具。 Borlands编译器有implib.exe工具。

5,12:是(与4相同)

6,13:pew ...我不认为dll上有过期日期,但必须为正确的操作系统编译它们。

8,16:你需要.def来制作.a或.lib,如果你没有它,它实际上可以从.dll创建它。

答案 2 :(得分:3)

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。

答案 3 :(得分:0)

问题1:您应该通过链接器命令导入.h文件并链接.a文件,并在.dll输出附近复制.exe

问题2:您可以按.a文件

制作.def个文件
set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%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 Files\Microsoft Visual Studio 12.0\VC\bin;%PATH% lib /machine:x86 /def:libfftw3-3.def

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

var compare = function(choice1, choice2)
{
    if (choice1 === choice2)
    {return "The result is a tie!";}

    if (choice1 === "rock") 

    if (choice2 === "scissors")
    {return "rock wins";}

    else 
    {return "paper wins";}
};

问题11:是的,我告诉过你。

问题12:是的

问题13:不。

相关问题