带着问题学习是最好的
1.-D_GLIBCXX_USE_CXX11_ABI宏的作用是什么?
Dual ABI GCC 5 以后的版本,将std::string 与 std::list 重新实现了,对于c++03 与 c++11 来说, list<int> 从原有的 std::list<int> 变为了std::__cxx11::list<int> ,
从原有的std::string变为了std::__cxx11::string,所以在链接的时候,为了兼容旧版本的代码,GCC 5 同时实现了两个版本,在编译的时候需要启用_GLIBCXX_USE_CXX11_ABI 宏来选择链接到哪个版本
2、实验验证
新建mylib.h文件,内容如下:
#ifndef __MYLIB_H
#define __MYLIB_H
#include <string>
void print_string(const std::string & a);
#endif
新建mylib.cpp文件,内容如下:
#include <string>
#include <iostream>
void print_string(const std::string & a) {
std::cout <<__FILE__ << __LINE__ << " content of a:" << a << std::endl;
}
新建myapp.cpp文件,内容如下:
#include <string>
#include "mylib.h"
int main(){
print_string("FromMyApp");
return 0;
}
第一步:编译动态库
g++ -fPIC mylib.cpp -shared -o libmy.so
第二步:编译可执行文件
g++ myapp.cpp -o myapp -lmy -L./ -I./
这样是一定没问题的。
下面我们尝试两种情况
情况1:动态库采用D_GLIBCXX_USE_CXX11_ABI=1编译,而程序采用D_GLIBCXX_USE_CXX11_ABI=0编译
情况2:动态库采用D_GLIBCXX_USE_CXX11_ABI=0编译,而程序采用D_GLIBCXX_USE_CXX11_ABI=1编译
测试下编译出的
参考链接
http://litaotju.github.io/c++/2019/02/24/Why-we-need-D_GLIBCXX_USE_CXX11_ABI=0/