1、下载最新的源代码文件 gcc-13.2.0.tar.xzhttps://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz解压后,根据 contrib/download_prerequisites 中的依赖文件包
gmp='gmp-6.2.1.tar.bz2'
mpfr='mpfr-4.1.0.tar.bz2'
mpc='mpc-1.2.1.tar.gz'
isl='isl-0.24.tar.bz2'
base_url='https://gcc.gnu.org/pub/gcc/infrastructure/'
放入源文件目录,注释掉 download_prerequisites中的下载和校验
运行./contrib/download_prerequisites ,解压下载的依赖包,完成后提示 All prerequisites downloaded successfully.
在源码目录新建一个build文件夹 : mkdir build
目录结构如下:
2、进入build文件夹,执行
#../configure --enable-threads=posix -enable-checking=release -enable-languages=c,c++ -disable-multilib
#make –j6 编译
#make install 安装
make install DESTDIR=/your/dir
3、修改系统使用的gcc/g++
一般gcc/g++会安装到/usr/local/bin中,而编译时默认使用的是/usr/bin中的版本,因此,需要重新制作链接。
sudo rm -rf /usr/bin/gcc
sudo rm -rf /usr/bin/g++
sudo ln -s /usr/local/bin/gcc /usr/bin/gcc
sudo ln -s /usr/local/bin/g++ /usr/bin/g++
最后,检验安装是否成功.查看版本。会看到:gcc -v
程序运行时,搜索库的路径一般是/usr/lib64优先于/usr/local/lib64,导致程序运行时报错:
[root@rocky95 ~]# ./a.out
./a.out: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.**' not found (required by ./a.out)
修改系统配置文件,改变默认库文件搜索顺序
[root@rocky95 ld.so.conf.d]# echo '/usr/local/lib64' | tee /etc/ld.so.conf.d/locallib64.conf
/usr/local/lib64
[root@rocky95 ld.so.conf.d]# cat locallib64.conf
/usr/local/lib64
[root@rocky95 ld.so.conf.d]# echo '/usr/local/lib' | tee /etc/ld.so.conf.d/locallib.conf
/usr/local/lib
[root@rocky95 ld.so.conf.d]# cat locallib.conf
/usr/local/lib
[root@rocky95 ld.so.conf.d]# ldconfig
修改了配置文件后,你需要运行ldconfig命令来更新缓存,这样更改才会生效。
4、cmake中的配置
set(CMAKE_C_COMPULER "/usr/local/bin/gcc")
set(CMAKE_CXX_COMPULER "/usr/local/bin/g++")
几个环境变量:
vim /etc/profile # 最下方添加以下内容
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
export LD_LIBRARY_PATH="/usr/local/lib64:$LD_LIBRARY_PATH"
export PATH="/usr/local/bin:$PATH"
PATH是系统查找可执行文件的路径,系统通过PATH寻找这个命令,再运行这个命令(可执行文件)。所以,PATH 配置的路径下的可执行程序可以在任何位置执行,并且可以通过which来定位命令文件的位置。
LIBRARY_PATH 和 LD_LIBRARY_PATH 的主要区别在于它们的使用阶段和作用
LIBRARY_PATH:主要用于程序编译阶段,告诉编译器(如gcc)在编译时寻找动态链接库(.so文件)的附加搜索路径。
当编译一个程序并且该程序依赖于某些非标准路径下的共享库时,设置LIBRARY_PATH可以确保编译器找到这些库并正确链接到可执行文件中。
LD_LIBRARY_PATH:主要用于程序运行阶段,指定动态链接器(ld.so)在加载已编译好的可执行文件时查找动态链接库的额外路径。
当一个可执行文件需要加载系统默认路径之外的共享库来运行时,设置LD_LIBRARY_PATH可以让操作系统在运行时找到并加载那些非标准位置的动态链接库。
C_INCLUDE_PATH、CPLUS_INCLUDE_PATH以及CPATH常被用于在全局性地添加预处理C/C++时的包含目录,其中C_INCLUDE_PATH仅对预处理C有效,CPLUS_INCLUDE_PATH仅对预处理C++有效,而CPATH对所有语言均有效
5、使用标准库模块
# 首先编译 std 模块生成 CMI (gcm.cache),参数不变不用重新编译
g++ -std=c++23 -fmodules -O2 -c -fmodule-only -fsearch-include-path bits/std.cc
# 然后就可以编译自己的源文件了
g++ -std=c++23 -fmodules -O2 hello.cpp -o hello.out
[root@rocky95 ~]# cat hello.cpp
import std;
//#include<iostream>
int main() {
std::println("hello world");
//std::cout<<"hello world"<<std::endl;
return 0;
}
[root@rocky95 ~]#
[root@rocky95 ~]#
cmake编译
[root@rocky95 ~]# cat CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Hello)
#set(CMAKE_VERBOSE_MAKEFILE ON)
add_custom_command(
OUTPUT gcm.cache/std.gcm
COMMAND g++ -std=c++23 -fmodules -O3 -c -fmodule-only -fsearch-include-path bits/std.cc
)
add_custom_command(
OUTPUT hello.out
COMMAND g++ -std=c++23 -fmodules -O3 hello.cpp -o hello.out
)
add_custom_target(
target ALL
DEPENDS gcm.cache/std.gcm hello.out
)
[root@rocky95 ~]#