首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*.dll *.a *.lib *.def在VisualStudio与gcc之间的兼容性

*.dll *.a *.lib *.def在VisualStudio与gcc之间的兼容性
EN

Stack Overflow用户
提问于 2011-12-30 19:10:14
回答 4查看 19.9K关注 0票数 22

这很让人困惑。我花了很多时间阅读关于这方面的文章,等等,仍然很困惑。

我正在使用Qt和C++进行编码。在Qt中,我使用gcc选项作为编译器。

问题是,我尝试过的许多第三方库似乎都不起作用。

我对.dll、.a、.lib、.def文件和库方案都很陌生。

问题1:

在我有限的经验(到目前为止,我已经尝试过7或9个库),图书馆供应商很少告诉你.dll是用VisualStudio还是gcc制作的。这增加了许多混乱。它们几乎从来没有明确说明库与什么编译器兼容。因此,我很感激一些关于如何处理这场噩梦的真实生活小窍门。我尝试过的几乎所有的库都是OpenSource项目。这里我不提名字,但这些都是众所周知的项目。我相信问题是我缺乏知识..。

MinGW和gcc世界

Question2:

据我所知,用于MinGW gcc宇宙的动态MinGW库需要这些,对吗?

*.h

*.dll

*.a

问题3:

不幸的是,.a文件经常丢失,库无法工作。这很让人困惑。如果.a文件丢失了,我运气不好吗?

问题4:

如果.a是gcc制作的,我可以为MinGW/gcc生成*.dll文件吗?

问题5:如果.a是用VisualStudio制作的,我可以为MinGW/gcc生成*.dll文件吗?

问题6:

是否有可能*.dll (由MinGW/gcc制造)太旧,不再与新的MinGW/gcc兼容?

问题7:

使用MinGW/gcc的Qt项目从来不需要*.lib文件,对吗?那是VisualStudio唯一的东西,对吗?

问题8:

在使用MinGW/gcc的Qt项目中,我不需要使用*.def文件来使用*.dll,对吗?

VisualStudio World

问题9:

据我所知,用于VisualStudio的动态VisualStudio库需要以下内容:

*.h

*.dll

*.lib

对吗?同样,问题是*.lib文件几乎总是丢失。另外,对于库与哪个编译器兼容,没有明确的说明。那么,我怎么知道它是否只适用于VisualStudio呢?

问题10:

如果.lib文件丢失了,我运气不好吗?

问题11:

如果.lib是用VisualStudio制作的,那么可以为VisualStudio生成*.dll文件吗?多么?

问题12:

如果.lib是用MinGW/gcc制作的,我可以为VisualStudio生成*.dll文件吗?多么?

问题13:

*.dll (由VisualStudio制造)是否可能太老,不再与较新的VisualStudio兼容?

问题14:

如果在QtCreator中我选择了VisualStudio编译器,那么它是否与其他人用真实VisualStudio编译的动态库100%兼容?我相信Qt中的VisualStudio编译器选项是一个假的VisualStudio编译器。

问题15:

如果在QtCreator中我选择了MinGW/gcc编译器,那么我可以使用其他人用实际VisualStudio编译的Qt动态库吗?

问题16:

在使用MinGW/gcc的Qt项目中,我不需要使用*.def文件来使用*.dll,对吗?

问题17:我能否将使用实*.dll和*.h生成的*lib文件转换为*.a文件,以便在Qt gcc项目中使用*.a文件和*.h文件?

EN

回答 4

Stack Overflow用户

发布于 2011-12-30 19:45:52

也许这是值得的,从一开始,而不是跳出我们的前面,描述核心问题。由此可以得出几个问题的答案。

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

函数是如何调用的,例如哪些参数进入哪个寄存器,或者它们在堆栈上放置了什么位置--如何抛出异常--如何抛出对象,例如"vtable指针“到哪里,使用了什么填充,内建数据类型有多大(h 19

  • etc.

如何将函数名”损坏“到符号H 210H 111如何布局H 212H 113>标准库>)

大多数平台都定义了C,但是没有定义C++ ABI。因此,编译器定义了他们自己的ABI (除了通常存在的C类之外的所有东西)。这会产生不同编译器之间不兼容的对象文件(有时甚至在同一编译器的版本之间)。

通常情况下,这会以一些奇怪的名字表现出来:不同的ABI故意使用不同的名称来防止意外地链接一个无法工作的可执行文件。要解决这些问题,最好的方法是使用相同的编译器构建所有组件。

如果要确定使用哪个编译器生成库,可以使用适当的工具查看其内容。我意识到您要求使用Windows,但我只知道UNIX工具(它们可能在MingW中可用):

查看符号名(通常与libraries

  • ident或grep一起使用)来构建或检查object

  • strings中的特殊字符串,以找到嵌入在object

  • strings中的特殊字符串,以使所有strings

  • c++filt都能将符号分解到C++声明

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

这个地区还有很多,但我已经没有精力了.

票数 16
EN

Stack Overflow用户

发布于 2013-01-05 01:12:01

在搜索要使用代码::阻止用于windows的.a编译器创建c++文件的工具时,我偶然发现了这个问题。代码:块使用MinGW gcc编译器。在谷歌上,它的高度足以证明我的亡灵能力。

动态链接库(Dll)是一组混合的库。有些代码的编译方式使它们在编程语言和编译器之外很难使用。

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

他说:这不是一个问题。

2、9:是

3、10:否

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

5、12:是(与4相同)

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

8,16:您需要.def来生成.a或.lib,如果您没有它,从.dll创建它实际上是可行的。

票数 7
EN

Stack Overflow用户

发布于 2011-12-30 19:20:05

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

如果应用程序是使用“动态链接库”编译的,则DLLs必须已经存在于系统上,因此您必须在安装程序中包含必要的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。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8683046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档