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

接下来利用cmake进行构建:

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

利用cmake构建

$ cmake -G <generator> [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选择的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在编译时选择编译工具链的问题

先贴出项目目录结构:

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

include/random.hpp

#ifndef __RANDOM_H__
#define __RANDOM_H__

int get_random_number();

#endif

src/random.cpp

#include "random.hpp"
#include <iostream>

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

src/main.cpp

#include <iostream>
#include <include/random.hpp>

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

 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可能因为版本问题,一直出错。将来留待解决

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用CMake进行交叉编译时,可以使用以下步骤来配置valgrind: 1. 在CMakeLists.txt文件中,使用set命令设置CMAKE_C_COMPILER和CMAKE_CXX_COMPILER变量,将其分别指向Clang的C和C++编译器。\[1\] 2. 将交叉编译器添加到cmake-tools-kits.json文件中,可以在文件末尾添加以下配置信息: ``` { "name": "arm_cross_compiler", "toolchainFile": "/path/to/toolchain.cmake" } ``` 其中,toolchain.cmake是指向valgrind的交叉编译工具文件的路径。\[2\] 3. 运行CMake生成Makefile,并进行编译。在编译过程中,可以使用valgrind进行内存泄漏检测和性能分析。 请注意,具体的配置步骤可能因项目和工具的不同而有所差异。建议参考相关文档或教程以获取更详细的指导。 #### 引用[.reference_title] - *1* *3* [CMake基础(9)使用Clang编译](https://blog.csdn.net/SHH_1064994894/article/details/129164636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VSCode与CMake搭配使用之交叉编译](https://blog.csdn.net/jiasike/article/details/107474690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值