|
背景是这样的:项目中想引用一个新的库,但是这个库用了很多新特性,需要C++17。但是同时项目中也用了很多来自公司内部其他部门的so,基本都是用gcc 4.8.5,c++11编译的。
在网上查了一下,这个帖子把这件事情说的比较清楚:
情况一、三个object,A、B、C,都是用GCC 7编译,分别用的是-std=c++03, -std=c++11, -std=c++17,那么这三个可以链接到一起,执行起来没问题。
情况二、A是GCC 4.9,-std=c++03,B是GCC 5,-std=c++11,C是GCC 7,-std=c++17,那么这三个也可以链接到一起,因为在A和B对应的GCC版本中,对应的C++03,11都是stable的,是向后兼容的,C用的GCC 7的c++17虽然是experimental的,但是C不存在兼容性问题。
如果这时还有个D,用的是GCC 8,-std=c++17,那么又会产生一个不兼容的现象:GCC 7的c++17是experimental的,GCC 8的c++17是stable的。这时需要将C和D都用GCC 8编译,才能兼容。
情况三、从上面列举出来的原因可以看出,如果A是GCC 4.9 ,-std=c++11编译的,那么跟任何支持c++ 17的GCC版本都会不兼容,因为GCC 4.9的c++ 11是experimental的。
附带的还有一个-D_GLIBCXX_USE_CXX11_ABI=0或=1的宏,这个是在GCC 5引入的,GCC 5中实现了两个版本的std::string,互不兼容。如果要和旧版本的c++11兼容,比如GCC 4,就需要设置-D_GLIBCXX_USE_CXX11_ABI=0。如果要和新版本c++11,或者c++03兼容,就需要设置-D_GLIBCXX_USE_CXX11_ABI=1。
原帖在这里: https://stackoverflow.com/questions/46746878/is-it-safe-to-link-c17-c14-and-c11-objects |
|