CentOS C++开发环境准备

Posted 文大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CentOS C++开发环境准备相关的知识,希望对你有一定的参考价值。

CMake

Releases · Kitware/CMake · GitHub下载对应版本

当前使用cmake-3.22.4-linux-x86_64.tar.gz

tar -zxf cmake-3.22.4-linux-x86_64.tar.gz 解压

ln -s /home/wenzhou/cmake-3.22.4-linux-x86_64/bin/cmake /usr/bin/cmake 创建软链接

cmake --version 校验安装成功

cmake使用常用参考

前言 · GitBook

Learn CMake's Scripting Language in 15 Minutes

Ninja

make的并行版本,相对make 多核并行编译更友好

下载 ninja-linux.zip Releases · ninja-build/ninja · GitHub

直接复制到 /usr/bin/ninja

ninja --version 验证安装成功

使用和make类似

GCC/G++

默认使用yum安装gcc最高4.8.5,如下

yum install -y gcc gcc-c++

更高版本可以从源码编译安装(比较麻烦),或使用官方提供的devtoolset,如下操作

安装centos-release-scl

sudo yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm
sudo yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm

安装devtoolset

可以安装对应不同版本的devtoolset-版本-gcc-c++

sudo yum install devtoolset-11-gcc-c++

如下命令查看当前按安装的toolset

rpm -qa | grep devtoolset

激活对应开发环境

如下命令行

scl enable devtoolset-11 bash

或者

source /opt/rh/devtoolset-9/enable

如下查看当前gcc/g++版本

gcc --version

g++ --version

scl enable devtoolset-11 bash激活命令只对本次会话有效,重启会话或者切换用户后还是会变回原来的4.8.5版本,因为安装的devtoolset是在/opt/rh目录下的。为了保证重启后不变,实践最好的方式是替换默认的gcc/g++路径,如下

mv /usr/bin/gcc /usr/bin/gcc-4.8.5

ln -s /opt/rh/devtoolset-11/root/usr/bin/gcc /usr/bin/gcc

ln -s /opt/rh/devtoolset-11/root/usr/bin/g++ /usr/bin/g++

参考【Linux基础】CentOS 7环境下安装高版本GCC (gcc/g++ 9.3)

Ubuntu环境多版本C++ 使用update-alternatives 参考

 gcc/g++多版本切换 (ubuntu18.04)

Ubuntu 18.04下gcc、g++不同版本的安装与转换_Linux教程

LLVM/CLANG

可以参考gcc/g++ devtoolset安装,但是默认7.x只支持devtoolset-7-llvm,要安装最新版本,只能通过源码编译方式完成,前提先按照如上步骤完成新版gcc/g++安装。

现在llvm相关资源已经整合进项目https://github.com/llvm/llvm-project.git中,减少了上手成本,直接参考官方文档Getting Started with the LLVM System,具体如下操作

环境准备

参考文档,如下

下载源码

git下载指定分支

git clone --branch release/14.x https://github.com/llvm/llvm-project.git

或直接下载指定版本

wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-14.0.5.tar.gz

解压后进入目录

生成make文件

mkdir build

cd build

cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld;"

-G 指定具体编译文件对象,默认生成unix make文件,这里指定ninja编译来加速。

注意这里,有人编译正式版本时会加上-DLLVM_ENABLE_ASSERTIONS=On,大部分情况没问题,但是特殊情况会触发Assert(参考 Issue #36347 · ClickHouse/ClickHouse · GitHub),因此Release不要开启

可以使用 -DCMAKE_INSTALL_PREFIX=/usr/local 指定安装目录,默认/usr/local。

编译安装

如下编译

cmake --build build

生成的文件,如下安装到预先指定目录

ninja install

如下检查安装是否成功

clang --version

clang++ --version

注意查看clang clang++可执行文件,发现他们指向同一个文件,但是实际使用中不能混用这两个命令,因为实际编译过程会检查当前命令来决定链接的运行时和引用头文件

当前编译环境设置

llvm 是一个通用的编译优化和代码生成平台,算是编译后端,在此基础上构建的clang 是最近几年(在大财主苹果的支持下)发展得非常好的 C 家族语言 (包括C/C++/Obj-C/Obj-C++) 编译器前端,所谓前端,就是它可以认识 C/C++/Obj-C/ObjC++ 代码,并且把它转化成某种更接近机器指令的形式。

因此,参考The LLVM Compiler Infrastructure Project

clang编译时默认会复用部分GCC的东西,对标GCC存在如下

1.标准库

libc++ 是针对 clang 特别重写的 C++ 标准库,也算是 clang 的“御用”库了。这就像 libstdc++ 和 gcc 的关系,但 clang 也可以用 libstdc++。

如果要使用libc++,编译clang指定参数-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi",目前可能实际使用还有些问题,一般倾向于不开启,默认使用 libstdc++。

 参考 Linux 编译运行查找头文件和库的顺序

2.头文件

默认clang 认为 c++ 头文件位于 /usr/include/c++ 底下,如果使用 libstdc++且通过devtoolset安装,需要如下把对应的c++头文件链接到这里

ln -s /usr/include/c++/11 /opt/rh/devtoolset-11/root/usr/include/c++/11

clang 认为 libc++ 头文件位于 /usr/include/c++/v1 底下,如果使用libc++,需要把libcxx/include目录链接到这里。

3.链接器

默认使用gcc的ld链接器,如果要使用clang的lld(一般开启,效率更高),编译时指定参数-DLLVM_ENABLE_PROJECTS="lld"。

4.查看编译配置

参考macOS使用源码build的clang无法编译c/cpp的问题

经常会遇到找不到头文件和链接库的情况,最简单的 方法运行如下代码,查看当前设置的相关路径是否包含了对应的头文件和库文件。

clang -x c -E - -v < /dev/null

clang -x c++ -E - -v < /dev/null

分别输出c文件、c++文件对应的路径

比如c++输出如下

clang version 14.0.1
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/11
Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/11
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
 (in-process)
 "/usr/local/bin/clang-14" -cc1 -triple x86_64-unknown-linux-gnu -E -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name - -mrelocation-model static -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -v -fcoverage-compilation-dir=/home/wenzhou -resource-dir /usr/local/lib/clang/14.0.1 -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11 -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/x86_64-redhat-linux -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/backward -internal-isystem /usr/local/lib/clang/14.0.1/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/11/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir=/home/wenzhou -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o - -x c++ -
clang -cc1 version 14.0.1 based upon LLVM 14.0.1 default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/11/../../../../x86_64-redhat-linux/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11
 /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/backward
 /usr/local/lib/clang/14.0.1/include
 /usr/local/include
 /usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 400 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2

以上是关于CentOS C++开发环境准备的主要内容,如果未能解决你的问题,请参考以下文章

CentOS C++开发环境准备

centos下怎么搭建c++的开发环境

CentoS 7系统安装redis教程

CentoS 7系统安装redis教程

C++笔记-Centos7搭建OpenCV3.4开发环境

C++笔记-Centos7搭建OpenCV3.4开发环境