离线编译安装GCC 13.2

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中的下载和校验

e5c0df9a50d54a788516e7d36c7f3704.png

 运行./contrib/download_prerequisites ,解压下载的依赖包,完成后提示  All prerequisites downloaded successfully.

在源码目录新建一个build文件夹 : mkdir build

目录结构如下:

aaa3f158e47f4fc68e30ebe9f5d080a0.png

 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_PATHLD_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 ~]# 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值