我使用 MinGW v8 构建了一个 C++ 库。该库动态链接到 MinGW 中包含的标准 C++ 库
libgcc_s_seh-1.dll
、libstdc++-6.dll
和 libwinpthread-1.dll
。
现在我正在尝试使用较新版本的 MinGW v11 构建另一个 C++ 应用程序。该应用程序动态链接到我之前构建的库。该应用程序还动态链接到标准 C++ 库
libgcc_s_seh-1.dll
、libstdc++-6.dll
和 libwinpthread-1.dll
。
现在的问题是该库需要 v8 中的相同文件,而应用程序需要 v11 中的这些文件。根据我包含的版本,我在运行时收到不同的错误。
我想知道,人们通常如何处理这一问题?库和应用程序是否需要使用相同的编译器版本来构建以避免冲突,或者我的理解中是否缺少某些内容?谢谢。
与 C 不同,C++ 通常不会为您的函数提供稳定的 ABI。因此,如果您尝试链接使用不同工具链构建的两个 C++ 库(甚至是同品牌工具链的不同版本),则很有可能会出现链接器错误。
最快的解决方案是重新编译旧的库(如果您仍然有源代码)。如果您想要 ABI 稳定性,您可以在 C++ 代码周围维护一组
extern "C"
包装器,这样您就无需担心链接问题。