这很让人困惑。我花了很多时间阅读关于这方面的文章,等等,仍然很困惑。
我正在使用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文件?
发布于 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和符号本身。
这个地区还有很多,但我已经没有精力了.
发布于 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创建它实际上是可行的。
发布于 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。
https://stackoverflow.com/questions/8683046
复制相似问题