概述
当你的项目打算从低版本的GCC
(如GCC4
)升级后,你可能会遇到GCC undefined references with abi:cxx11
之类的问题,究其原因是GCC5.1
开始,STL
标准库中的std::string
和一些标准库被新的方法实现,但由于其std::basic_string
影响较大,因此很多库都会或多或少受影响。如果你需要使用的库恰好是GCC4
编译的,那么,除了使用新版本GCC
重新编译库之外,只能通过GLIBCXX_USE_CXX11_ABI
的方式解决了。
使用重新编译的方式解决
以源码方式使用新版本GCC重新编译动态库,并使用新的动态库,这种方式最优。
强制使用CXX11编译
我们可以在编译期指定GLIBCXX_USE_CXX11_ABI
宏,让编译器强制使用C++11所使用的接口。
CMAKE
对于CMAKE来说,我们需要在CMakeList.txt
添加:
1 |
|
或者在调用cmake命令时传入:
1 |
|
Makefile
对于Makefile来说,我们同样也是在合适的地方添加宏,最终的效果是:
1 |
|
局限性
但是该方法只能说是权宜之计,因为其有一个很明显的局限性,如果你的程序同时使用了多个动态库,这些动态库如果都是使用GCC4编译的那没有什么问题,但如果这些动态库中存在有使用高版本编译的动态库时,则可能会出现新的问题。