将程序链接到库,每个库使用不同的 _GLIBCXX_USE_CXX11_ABI

Posted

技术标签:

【中文标题】将程序链接到库,每个库使用不同的 _GLIBCXX_USE_CXX11_ABI【英文标题】:Linking a program to libraries the use different _GLIBCXX_USE_CXX11_ABI each 【发布时间】:2018-02-01 11:19:40 【问题描述】:

我正在尝试编译一个依赖于两个库的程序(使用 GCC 5.4.O)。库 A 是使用旧 ABI 编译的,而库 B 是使用新 C++11 ABI 编译的(请参阅Dual ABI)。

如果编译程序设置_GLIBCXX_USE_CXX11_ABI 1,我与库A的链接错误。如果我将它设置为0,我与库B的链接错误。

是否可以指示编译器使用 _GLIBCXX_USE_CXX11_ABI 的一个值来编译对一个库的调用,并使用 _GLIBCXX_USE_CXX11_ABI 的另一个值来编译对另一个库的调用?

如果我理解正确,this is possible 在编译依赖于其他两个但我不知道程序是否也是如此的新库时。

【问题讨论】:

【参考方案1】:

是否可以指示编译器使用 _GLIBCXX_USE_CXX11_ABI 的一个值来编译对一个库的调用,并使用 _GLIBCXX_USE_CXX11_ABI 的另一个值来编译对另一个库的调用?

没有办法告诉编译器为您执行此操作。无论如何它都行不通,新旧 std::string 类型不兼容,这就是拥有两个不同 ABI 的全部意义所在。

您可以手动确保对库 A 的所有调用都发生在使用 _GLIBCXX_USE_CXX11_ABI=0 编译的代码中,而对库 B 的所有调用都发生在使用 _GLIBCXX_USE_CXX11_ABI=1 编译的代码中。这意味着您永远不能从单个源文件调用这两个库。

您必须将库 A 的所有用途和库 B 的所有用途分开,并且不要在程序的这两个部分之间传递 std::string(或 std::list)对象。

【讨论】:

以上是关于将程序链接到库,每个库使用不同的 _GLIBCXX_USE_CXX11_ABI的主要内容,如果未能解决你的问题,请参考以下文章

将 Nginx 构建到库中

CodeIgniter:在每个库中加载模型或将模型从控制器内“传递”到库中

链接到库需要 MFC80U.LIB

是否可以将配置文件从客户端应用程序传递到库项目?

gcc升级后静态库要升级吗

将Crashlytics集成到库项目中