gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:51:52 26 4
gpt4 key购买 nike

这很令人困惑。我花了很多时间在堆栈等上阅读有关此的帖子。仍然感到困惑。

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

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

问题一:

根据我有限的经验(到目前为止,我已经尝试了 7 或 9 个库),库的供应商很少告诉您 .dll 是用 VisualStudio 还是 gcc 制作的。这增加了很多困惑。他们几乎从未明确说明该库与哪种编译器兼容。所以我会很感激一些关于如何处理这个噩梦的现实生活中的提示。我尝试的几乎所有库都是开源项目。我不会在这里命名,但这些都是众所周知的项目。我确定问题是我缺乏知识...

MinGW 和 gcc 世界

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

VisualStudio 世界

问题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 项目中,我不需要 *.def 文件来使用 *.dll,对吧?

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

最佳答案

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

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

  • 如何调用函数,例如哪些参数进入哪些寄存器或它们放在堆栈的哪个位置
  • 如何抛出异常
  • 对象的布局方式,例如“vtable 指针”在哪里,使用什么填充
  • 内置数据类型有多大
  • 如何将函数名称“变形”为符号
  • 类型信息的布局方式
  • 标准库类的布局
  • 等等

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

通常,这表现为看起来很奇怪的名称不知何故未定义:不同的 ABI 故意使用不同的名称修饰来防止意外链接无论如何都不会工作的可执行文件。要解决这些问题,最好的办法是使用相同的编译器构建所有组件。

如果您想确定使用哪个编译器构建库,可以使用适当的工具查看其内容。我知道您要求使用 Windows,但我只知道 UNIX 工具(它们可能与 MingW 一起可用):

  • nm 查看符号名称(通常与 less 或 grep 一起使用)
  • 用于构建或检查库
  • ident 查找嵌入在对象中的特殊字符串
  • 收藏所有字符串的字符串
  • c++filt 将符号分解到其 C++ 声明中

查看符号通常会识别出编译器生成它们的原因。如果你足够频繁地看到它们,你甚至可以从符号本身中分辨出 ABI。

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

关于c++ - VisualStudio 和 gcc 之间 *.dll *.a *.lib *.def 的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com