C++三方库编译之GCC11.3.0

2024-05-26 12:44
文章标签 c++ 编译 三方 gcc11.3

本文主要是介绍C++三方库编译之GCC11.3.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本系列准备持续更新,目的是将网上开源的三方库的编译过程与步骤,无脑展示,内容纯执行脚本与代码,不讲原理,也不科普库。

三方库编译很简单的(三板斧:configure+make+install),为啥还需要整理?需要的!

  • 一,三方库很多都是自动安装到系统里的,可这并不是我们所需,而且还可能没权限,或者与系统版本冲突,引发其他问题,所以,最好自定义目录。
  • 二,三方库本身可能会依赖其他库,而且是内置的,而实际已有,或与所需的其他库版本冲突,需要重新链接与包含,而本步骤,全指明。
  • 三,库里的有些参数,相当隐晦,不设置用不了,或是实际常用的参数,里面不提供,与其这样,倒不如直接提供。
  • 四,部分三方库还有缺陷,比如不同gcc编译的支持,比如代码or编译文件中写死的路径;比如风险函数的告警,等,需要细微改进。

如此,希望所需的同行们,直接copy即可。

话不多说,本篇是如何升级到GCC11.3.0(前提,机器有低版本的可用的gcc),需要的按照步骤执行即可(如果是脚本命令的话)

gcc与c++版本

GCC支持C++特性说明: C++ compiler support - cppreference.com
GCC各个版本官网下载:GCC, the GNU Compiler Collection- GNU Project

下载GCC与依赖库

wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-11.3.0/gcc-11.3.0.tar.xz
wget https://mirrors.ustc.edu.cn/gnu/gmp/gmp-4.3.2.tar.bz2
wget https://mirrors.ustc.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.bz2
wget https://mirrors.ustc.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz

设置编译变量

gcc_verson=11.3.0
gcc_name=gcc-$gcc_verson
gmp_name=gmp-4.3.2
mpfr_name=mpfr-3.1.4
mpc_name=mpc-1.0.3
dir_package=$(pwd)
dir_install=$(pwd)/$gcc_name-full-install
#rm -fr $dir_install

编译 $gmp_name

mkdir -p $dir_install/$gmp_name
cd $dir_package && rm -fr $gmp_name
tar -xjf $gmp_name.tar.bz2
cd $gmp_name 
./configure  --prefix=$dir_install/$gmp_name
make clean && make -j$(nproc) && make install

编译 $mpfr_name

mkdir -p $dir_install/$mpfr_name
cd $dir_package && rm -fr $mpfr_name
tar -xjf $mpfr_name.tar.bz2
cd $mpfr_name 
./configure  --prefix=$dir_install/$mpfr_name  --with-gmp=$dir_install/$gmp_name
make clean && make -j$(nproc) && make install

编译 $mpc_name

mkdir -p $dir_install/$mpc_name
cd $dir_package && rm -fr $mpc_name
tar -xzvf $mpc_name.tar.gz
cd $mpc_name 
./configure  --prefix=$dir_install/$mpc_name --with-gmp=$dir_install/$gmp_name  --with-mpfr=$dir_install/$mpfr_name
make clean && make -j$(nproc) && make install

编译 $gcc_name

export LD_LIBRARY_PATH=$dir_install/$gmp_name/lib:$dir_install/$mpfr_name/lib:$dir_install/$mpc_name/lib:$LD_LIBRARY_PATH
mkdir -p $dir_install/$gcc_name
cd $dir_package && rm -fr $gcc_name
tar -xf $gcc_name.tar.xz
cd $gcc_name 
./configure  --prefix=$dir_install/$gcc_name  --with-gmp=$dir_install/$gmp_name  --with-mpfr=$dir_install/$mpfr_name  --with-mpc=$dir_install/$mpc_name --enable-threads=posix --disable-checking --enable--long-long --disable-multilib --enable-languages=c,c++ --disable-libstdcxx-pch
make clean && make -j$(nproc) && make install

配置运行时的环境变量

gcc_env_sh=$gcc_name.env.sh
echo 'gcc_base=$(cd $(dirname $BASH_SOURCE) && pwd )' >  $dir_install/$gcc_env_sh
echo "gcc_verson=$gcc_verson"                         >> $dir_install/$gcc_env_sh
echo "gcc_home=\$gcc_base/$gcc_name"                  >> $dir_install/$gcc_env_sh
echo "gmp_home=\$gcc_base/$gmp_name"                  >> $dir_install/$gcc_env_sh
echo "mpfr_home=\$gcc_base/$mpfr_name"                >> $dir_install/$gcc_env_sh
echo "mpc_home=\$gcc_base/$mpc_name"                  >> $dir_install/$gcc_env_sh
echo ''                                               >> $dir_install/$gcc_env_sh
echo 'export CC=$gcc_home/bin/gcc'                    >> $dir_install/$gcc_env_sh
echo 'export CXX=$gcc_home/bin/g++'                   >> $dir_install/$gcc_env_sh
echo 'alias gcc=$gcc_home/bin/gcc'                    >> $dir_install/$gcc_env_sh
echo 'alias g++=$gcc_home/bin/g++'                    >> $dir_install/$gcc_env_sh
echo ''                                               >> $dir_install/$gcc_env_sh
echo 'if [[ -z "$C_INCLUDE_PATH" ]];then'                                                                                                                                         >> $dir_install/$gcc_env_sh
echo '    export C_INCLUDE_PATH=$gcc_home/include/c++/$gcc_verson:$gcc_home/include/c++/$gcc_verson/x86_64-pc-linux-gnu:/usr/include:/usr/include:/usr/local/include'             >> $dir_install/$gcc_env_sh
echo 'else'                                                                                                                                                                       >> $dir_install/$gcc_env_sh                                                                                                                                                                      >> $dir_install/$gcc_env_sh
echo '    export C_INCLUDE_PATH=$gcc_home/include/c++/$gcc_verson:$gcc_home/include/c++/$gcc_verson/x86_64-pc-linux-gnu:$C_INCLUDE_PATH'                                          >> $dir_install/$gcc_env_sh
echo 'fi'                                                                                                                                                                         >> $dir_install/$gcc_env_sh                                                                                                                            >> $dir_install/$gcc_env_sh
echo 'if [[ -z "$CPLUS_INCLUDE_PATH" ]];then'                                                                                                                                     >> $dir_install/$gcc_env_sh
echo '    export CPLUS_INCLUDE_PATH=$gcc_home/include/c++/$gcc_verson:$gcc_home/include/c++/$gcc_verson/x86_64-pc-linux-gnu:/usr/include:/usr/include:/usr/local/include'         >> $dir_install/$gcc_env_sh
echo 'else'                                                                                                                                                                       >> $dir_install/$gcc_env_sh
echo '    export CPLUS_INCLUDE_PATH=$gcc_home/include/c++/$gcc_verson:$gcc_home/include/c++/$gcc_verson/x86_64-pc-linux-gnu:$CPLUS_INCLUDE_PATH'                                  >> $dir_install/$gcc_env_sh
echo 'fi'                                                                                                                                                                         >> $dir_install/$gcc_env_sh
echo 'if [[ -z "$LD_LIBRARY_PATH" ]];then'                                                                                                                                        >> $dir_install/$gcc_env_sh
echo '    export LD_LIBRARY_PATH=$gmp_home/lib:$mpfr_home/lib:$mpc_home/lib:$gcc_home/lib:$gcc_home/lib64:$gcc_home/libexec/gcc/x86_64-pc-linux-gnu/$gcc_verson'                  >> $dir_install/$gcc_env_sh
echo 'else'                                                                                                                                                                       >> $dir_install/$gcc_env_sh
echo '    export LD_LIBRARY_PATH=$gmp_home/lib:$mpfr_home/lib:$mpc_home/lib:$gcc_home/lib:$gcc_home/lib64:$gcc_home/libexec/gcc/x86_64-pc-linux-gnu/$gcc_verson:$LD_LIBRARY_PATH' >> $dir_install/$gcc_env_sh
echo 'fi'                                       >> $dir_install/$gcc_env_sh
echo 'if [[ -z "$PATH" ]];then'                 >> $dir_install/$gcc_env_sh
echo '    export PATH=$gcc_home/bin'            >> $dir_install/$gcc_env_sh
echo 'else'                                     >> $dir_install/$gcc_env_sh
echo '    export PATH=$gcc_home/bin:$PATH'      >> $dir_install/$gcc_env_sh
echo 'fi'                                       >> $dir_install/$gcc_env_sh
echo 'echo "----current gcc info:"'             >> $dir_install/$gcc_env_sh
echo 'echo "----gcc:$gcc_home/bin/gcc"'         >> $dir_install/$gcc_env_sh
echo 'echo "----g++:$gcc_home/bin/g++"'         >> $dir_install/$gcc_env_sh
echo ''                                         >> $dir_install/$gcc_env_sh

打包

package_name=$(basename $dir_install )
cd $dir_install/..
tar czf $package_name.tar.gz $package_name

使用

  1. 加载环境变量:source $dir_install/$gcc_env_sh
  2. 查看当前版本:gcc --version  (打印)
  3. 添加编译参数:-std=c++20  or  add_compile_options(-std=c++20)

这篇关于C++三方库编译之GCC11.3.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004502

相关文章

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函