gpt4 book ai didi

C++ 动态库编译/链接

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:45 26 4
gpt4 key购买 nike

我知道,如果我将我的 C++ 程序链接到使用不同版本的 Visual Studio 构建的动态库 (DLL),由于二进制兼容性问题,它将无法运行。(我在 Boost 库和 VS 2005 和 2008 中经历过这种情况)

但我的问题是:所有版本的 MSVS 都是这样吗?这是否也适用于静态库 (LIB)?这也是 GCC 和 Linux 的问题吗?最后如何在 VS 中链接到使用 MinGW 构建的 DLL?

顺便说一句,除了跨平台或跨编译器,为什么同一个编译器(VS)的两个版本不能兼容?

最佳答案

Hi. I know that if I link my c++ program to a dynamic library (DLL) that was built with a different version of Visual Studio, it won't work because of the binary compatibility issue. (I have experienced this with Boost library and VS 2005 and 2008)

我不记得曾见过 MS 更改 ABI,因此技术上不同版本的编译器将产生相同的输出(给定相同的标志(见下文))。

因此我认为这不是 Dev Studio 中的不兼容性,而是 Boost 中的变化。
不同版本的 boost 不向后兼容(在二进制中,源代码它们是向后兼容的)。

But my question is: is this true for all versions of MSVS?

我不认为有问题。现在,如果您使用不同的标志,您可以使目标文件不兼容。这就是为什么将调试/发布二进制文件构建到单独的目录中并链接到不同版本的标准运行时的原因。

Does this apply to static libraries(LIB) as well?

您必须链接到正确的静态库。但是一旦静态库在您的代码中,它就会卡在那里,所有已解析的名称都不会在以后重新解析。

Is this an issue with GCC & Linux as well?

是的。 GCC 已经多次破坏 ABI 中的向后兼容性(有几次是故意的(有些是错误的))。这不是一个真正的问题,因为在 Linux 上代码通常作为源代码分发,您在您的平台上编译它就可以工作。

and finally how about linking in VS to a DLL built with MinGW?

对不起,我不知道。

By the way aside from cross-platform or cross-compiler, why can't two version of the same compiler(VS) be compatibile?

充分优化的代码对象可能会被压缩得更多,因此对齐方式不同。其他编译器标志可能会影响生成与其他二进制对象不兼容的代码的方式(更改调用函数的方式(堆栈上的所有参数或寄存器中的某些参数))。从技术上讲,只有使用完全相同的标志编译的对象才应该链接在一起(从技术上讲,它比这有点宽松,因为很多标志不会影响二进制兼容性)。

请注意,某些库随同一个库的多个版本一起发布,这些版本以不同的方式编译。您通常通过末尾的扩展名来区分库。在我上一份工作中,我们使用了以下约定。

libASR.dll   // A Sincgle threaded Relase  version lib
libASD.dll // A Single threaded Debug version
libAMR.dll // A Multi threaded Release version
libAMD.dll // A Multi threaded Debug version

关于C++ 动态库编译/链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757566/

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