clang+cmake设置编译工具链

之前手动编译了clang,但是使用过程中遇到了很多问题,比如依赖的gcc版本问题,目前还没有解决。这里记录一下

手动编译clang

首先拉取llvm的源码

git clone https://github.com/llvm/llvm-project.git

cd llvm-project

mkdir build

#在build下进行构建编译
cd build

# 回退到稳定release版本 这里我选择的是 release 13.0.1
git reset --hard 75e33f7

clang+cmake设置编译工具链_第1张图片

接下来利用cmake进行构建:

注意llvm构建时很耗费资源和时间,我这里用的是服务器。用PC机的小伙伴注意一下。

利用cmake构建

$ cmake -G  [options] ../llvm

常用的generator有:

  • Ninja ——生成Ninja 文件
  • Unix Makefiles ——生成兼容make的makefile文件
  • Visual Studio ——生成Visual Studio项目与解决方案
  • Xcode ——用于生成Xcode项目

个人使用Unix Makefiles

常用的options有:

  • DCMAKE_INSTALL_PREFIX=directory ——为目录指定要在其中安装LLVM工具和库的完整路径名(默认/usr/local)。
  • DCMAKE_BUILD_TYPE=type ——type选项有Debug,Release,RelWithDebInfo和MinSizeRel。默认值为Debug。
  • DLLVM_ENABLE_ASSERTIONS=On ——启用断言检查进行编译。
  • DLLVM_ENABLE_PROJECTS=”…” ——要另外构建的LLVM子项目的列表,以’;’分隔。例如要构建LLVM,Clang,libcxx和libcxxabi,使用:DLLVM_INSTALL_PROJECTS="clang;libcxx;libcxxabi"
  • DLLVM_TARGETS_TO_BUILD=”…” ——构建针对的平台的部分项目,以’;’分隔。默认面向所有平台编译(all),指定只编译自己需要的CPU架构可以节省时间。

官方文档在这。

我这里用的构建命令为:

# 这里我设置的c编译和c++编译器都是我本地源码编译的高版本gcc
# centOS下 gcc版本是4.8 编译 llvm 至少得5.1版本以上
cmake -DCMAKE_C_COMPILER=$HOME/app/gcc-9.5.0-build/bin/gcc \
-DCMAKE_CXX_COMPILER=$HOME/app/gcc-9.5.0-build/bin/g++ \
-DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$HOME/app/llvm-build-13.0.1 \
-G "Unix Makefiles" \
-DLLVM_USE_LINKER=gold \
 ../llvm

我这里编译了所有架构的,机器性能差一些的可以在上面的基础上添加构建命令选项,指定架构

-DLLVM_TARGETS_TO_BUILD="X86"

接下来就是漫长的编译了

make -j4 && make install

默认安装的目录需要管理员权限,我这里安装的目录设置的是本地目录$HOME/app/llvm-build-13.0.1。安装完结果如下图:

clang版本为15.0.0

clang+cmake设置编译工具链_第2张图片

 这里默认clang选择的gcc版本为devtoolset-8版本的gcc。但是在我的单元测试中有问题,这里不知道怎么选择自己本地编译的gcc。路过的大牛有知道的告知一下呗

llvm clang源码编译安装 采用Ninja构建编译

安装依赖#

sudo apt install gcc-multilib

下载源码#

git clone --branch llvmorg-13.0.0 --recursive https://github.com/llvm/llvm-project

编译安装#

 

cd llvm-project
cmake -S llvm -B build_release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/llvm -G "Ninja" -DLLVM_USE_LINKER="gold" -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind"
cd build_release
ninja 
sudo ninja install

cd llvm-project cmake -S llvm -B build_release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/llvm -G "Ninja" -DLLVM_USE_LINKER="gold" -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" cd build_release ninja sudo ninja install

check version#

clang --version

下面说一下cmake在编译时选择编译工具链的问题

先贴出项目目录结构:

clang+cmake设置编译工具链_第3张图片

 代码很简单,就是生成一个随机数

include/random.hpp

#ifndef __RANDOM_H__
#define __RANDOM_H__

int get_random_number();

#endif

src/random.cpp

#include "random.hpp"
#include 

int get_random_number(){
    std::srand(time(NULL));
    return std::rand();
}

src/main.cpp

#include 
#include 

int main(int argc,char[] *argv){
    int random_number = get_random_number();
    std::cout<<"random number : "<

 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

set(CMAKE_C_COMPILER "/home/wzy/app/llvm-build-13.0.1/bin/clang")
set(CMAKE_CXX_COMPILER "/home/wzy/app/llvm-build-13.0.1/bin/clang++")

project(clang_test)


message(STATUS "C compiler : ${CMAKE_C_COMPILER}")
message(STATUS "CXX compiler : ${CMAKE_CXX_COMPILER}")

############################################################
# Create a library
############################################################

#Generate the shared library from the library sources
add_library(clang_random_library SHARED 
    src/random.cpp
)
add_library(clang_random::library ALIAS clang_random_library )

target_include_directories(clang_random_library 
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

############################################################
# Create an executable
############################################################

# Add an executable with the above sources
add_executable(clang_random_binary
    src/main.cpp
)

# link the new hello_library target with the hello_binary target
target_link_libraries( clang_random_binary
    PRIVATE 
        clang_random::library
)

linux.toolchain.cmake工具链的构建配置

cmake_minimum_required( VERSION  3.5 )
set(CMAKE_SYSTEM_NAME Linux )

set(CMAKE_C_COMPILER "/home/wzy/app/llvm-build-13.0.1/bin/clang")
set(CMAKE_CXX_COMPILER "/home/wzy/app/llvm-build-13.0.1/bin/clang++")

SET (CMAKE_C_COMPILER             "/home/wzy/app/llvm-build-13.0.1/bin/clang")
SET (CMAKE_C_FLAGS                "-Wall -std=c17")
SET (CMAKE_C_FLAGS_DEBUG          "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_CXX_COMPILER             "/home/wzy/app/llvm-build-13.0.1/bin/clang++")
SET (CMAKE_CXX_FLAGS                "-Wall -std=c++17")
SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_AR      "/home/wzy/app/llvm-build-13.0.1/bin/llvm-ar")
SET (CMAKE_LINKER  "/home/wzy/app/llvm-build-13.0.1/bin/llvm-ld")
SET (CMAKE_NM      "/home/wzy/app/llvm-build-13.0.1/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/home/wzy/app/llvm-build-13.0.1/bin/llvm-objdump")
SET (CMAKE_RANLIB  "/home/wzy/app/llvm-build-13.0.1/bin/llvm-ranlib")

 注意指定CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER配置选项信息需要放置在project之前,否则设置无效。

在执行时,使用

# 选择编译工具链配置选项文件,执行构建在build文件夹下
cmake -DCMAKE_TOOLCHAIN_FILE=./linux.toolchain.cmake -B build/

# 编译在build文件夹下
cmake --build build/

我这里的gcc可能因为版本问题,一直出错。将来留待解决

clang+cmake设置编译工具链_第4张图片

你可能感兴趣的:(c++)