之前手动编译了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
接下来利用cmake进行构建:
注意llvm构建时很耗费资源和时间,我这里用的是服务器。用PC机的小伙伴注意一下。
利用cmake构建
$ cmake -G [options] ../llvm
常用的generator有:
个人使用Unix Makefiles
常用的options有:
DLLVM_INSTALL_PROJECTS="clang;libcxx;libcxxabi"
官方文档在这。
我这里用的构建命令为:
# 这里我设置的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选择的gcc版本为devtoolset-8版本的gcc。但是在我的单元测试中有问题,这里不知道怎么选择自己本地编译的gcc。路过的大牛有知道的告知一下呗
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
clang --version
下面说一下cmake在编译时选择编译工具链的问题
先贴出项目目录结构:
代码很简单,就是生成一个随机数
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可能因为版本问题,一直出错。将来留待解决