将程序链接到库,每个库使用不同的 _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的主要内容,如果未能解决你的问题,请参考以下文章