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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本