-D_GLIBCXX_USE_CXX11_ABI宏实验

带着问题学习是最好的

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/

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值