gcc/g++编译器切换版本&链接问题

一、在Ubuntu利用wget命令下载安装包

https://gcc.gnu.org/pub/gcc/releases

二、下载依赖

cd gcc-6.4.0

./contrib/download_prerequisites

三、构建

mkdir build

cd build

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

四、编译(此步用时较长)

make

五、安装

make install

六、查看安装并切换版本

ls /usr/local/bin | grep gcc

ls /usr/bin/gcc*

ls /usr/bin/g++*

七、切换默认编译器

添加优先级(eg:100):

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100

注:gcc/g++版本号应该保持一致

八、保存修改

sudo update-alternatives --config gcc

注:<enter> to select

查看:

gcc -v

g++-v

 

链接问题:

编译成.obj:无需具体实现,仅需函数原型(包含相应头文件)

编译成.exe:使用 -ldl链接库,需要函数实现

 

常见报错:

implicit declaration of function 'XXX':未申明的引用 --找不到头文件

对‘XXX’未定义的引用--ld问题,找不到函数原型

 

GCC编译器版本ABI()问题:常发生在引用了string和list类型的采用GCC5之前版本编译的第三方动态库时。

不同版本编译器对C++规范实现程度不一致,GCC5.1及之后版本为libstdc++添加了新的特性,添加了__cxx11命名空间,string和list类型实际上是std::__cxx11::string和std::__cxx11::list,所以我们一般的using namespace std就会变成形如using namespace std::__cxx11的样子。

(1)修改cmake中的宏定义以选择链接库版本,旧版(c++03规范)/新版(c++11规范)

  • -D_GLIBCXX_USE_CXX11_ABI=0 链接旧版库
  • -D_GLIBCXX_USE_CXX11_ABI=1 链接新版库
if(CONAN_LIBCXX STREQUAL "libstdc++11")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
elseif(CONAN_LIBCXX STREQUAL "libstdc++")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()

由于编译环境工具链版本较高,多数GCC编译器的cmake应添加 add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)来编译。

(2)添加Makefile选项: 

gcc -std=c14 -D_GLIBCXX_USE_CXX11_ABI=0 ........




参考链接:https://www.jianshu.com/p/64b8ba832120

https://blog.csdn.net/weixin_33724046/article/details/86470690
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值