-D_GLIBCXX_USE_CXX11_ABI宏实验

带着问题学习是最好的

1.-D_GLIBCXX_USE_CXX11_ABI宏的作用是什么?

Dual ABI GCC 5 以后的版本,将std::string 与 std::list 重新实现了,对于c++03 与 c++11 来说, list 从原有的 std::list 变为了std::__cxx11::list ,

从原有的std::string变为了std::__cxx11::string,所以在链接的时候,为了兼容旧版本的代码,GCC 5 同时实现了两个版本,在编译的时候需要启用_GLIBCXX_USE_CXX11_ABI 宏来选择链接到哪个版本

2、实验验证

新建mylib.h文件,内容如下:

#ifndef __MYLIB_H 
#define __MYLIB_H 
#include  
void print_string(const std::string & a);
#endif

新建mylib.cpp文件,内容如下:

#include  
#include  
void print_string(const std::string & a)  {
    std::cout <<__FILE__ << __LINE__ << " content of a:"  << a << std::endl;
}

新建myapp.cpp文件,内容如下:

#include  
#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/

你可能感兴趣的:(玩转Linux编程)