微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 84|回复: 0

GCC的兼容性

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-3-24 06:32:11 | 显示全部楼层 |阅读模式
背景是这样的:项目中想引用一个新的库,但是这个库用了很多新特性,需要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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-22 00:40 , Processed in 0.067607 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表