一、在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