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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元