ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器

43 篇文章 7 订阅
11 篇文章 3 订阅
本文详细指导了如何在Ubuntu22.04上下载并手动安装最新稳定版本的LLVMClang17.0.6,包括设置编译器路径、配置CMake以使用新版本,以及解决头文件搜索路径问题和额外的依赖安装。
摘要由CSDN通过智能技术生成

ubuntu系统上的软件相比CentOS更新还是比较快的,但是还是难免有一些软件更新得不那么快,比如LLVM Clang编译器,目前ubuntu 22.04版本最高还只能安装LLVM 15,而LLVM 18 rc版本都出来了。参见https://github.com/llvm/llvm-project/releases

这里笔者就以最新稳定版本clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz来说明如何使用LLVM官方发布的tar.xz文件来安装Clang编译器。

一、下载安装clang+llvm

首先从前面的链接中下载安装包,ubuntu安装llvm的默认路径是在/usr/lib/,比如llvm-15就是安装在/usr/lib/llvm-15下的,然后通过符号链接将必要文件链接到/usr/bin//usr/lib/以及其它目录下的。我们也遵循这样的规则。

sudo tar xvf clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz 
sudo mv clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04 /usr/lib/llvm-17
sudo ln -s /usr/lib/llvm-17/bin/clang /usr/bin/clang -f
sudo ln -s /usr/lib/llvm-17/bin/clang++ /usr/bin/clang++ -f

即可。

如果要使用libc++库,则需要将路径/usr/lib/llvm-17/lib/x86_64-unknown-linux-gnu添加到ldconfig中,在/etc/ld.so.conf.d/中新建一个libcpp.conf文件,内容为:/usr/lib/llvm-17/lib/x86_64-unknown-linux-gnu,然后执行sudo ldconfig即可。

二、测试clang

这里笔者以前文C++ 20 Module中的示例来使用clang 17编译,并且使用libc++库,而不是stdlibc++

这里使用CMakePresets.json来配置CMake:

{
  "version": 3,
  "configurePresets": [
    {
      "name": "linux-debug",
      "displayName": "Linux Debug",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "installDir": "${sourceDir}/out/install/${presetName}",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_C_COMPILER": "clang",
        "CMAKE_CXX_COMPILER": "clang++"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      },
      "vendor": {
        "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {
          "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"
        }
      }
    }
  ],
  "buildPresets": [
    {
      "name": "linux-debug",
      "displayName": "linux-debug",
      "description": "自定义生成预设说明",
      "configurePreset": "linux-debug",
      "verbose": true,
      "jobs": 8
    }
  ]
}

由于示例中使用到了C++20的模块,所以需要在CMakeLists.txt中设置CMake的最低版本要求为3.28:

cmake_minimum_required(VERSION 3.28)

此时CMake会使用clang-scan-deps来扫描依赖,目前clang-scan-deps由于头文件搜索路径问题,会报错:

/usr/bin/../include/c++/v1/stddef.h:17:15: fatal error: 'stddef.h' file not found

是找不到头文件。

对于clang可以使用下面的命令来看clang的头文件搜索路径:

echo | clang -x c++ -v -E -

在这里插入图片描述
如果使用了libc++库,则需要添加上,使用:

echo | clang -x c++ -v -E - -stdlib=libc++

在这里插入图片描述
如果是GCC,则为:

echo | gcc -x c++ -v -E -

在这里插入图片描述

如果使用了libc++则需要添加/usr/lib/llvm-17/include/c++/v1,由于libc++库有使用libstdc++库的一些头文件,所以还需要添加stdc++的头文件路径:/usr/lib/gcc/x86_64-linux-gnu/11/include,其中11为版本号,根据安装的版本不同可能有所不同。可能还会有找不到__config_site文件的情况,该文件在/usr/lib/llvm-17/include/x86_64-unknown-linux-gnu/c++/v1

可以在CMakePresets.json中使用环境变量来设置:

 "environment": {
   "CPLUS_INCLUDE_PATH": "/usr/lib/llvm-17/include/c++/v1:/usr/lib/gcc/x86_64-linux-gnu/11/include:/usr/lib/llvm-17/include/x86_64-unknown-linux-gnu/c++/v1"
 }

如果没有使用libc++,则添加/usr/lib/gcc/x86_64-linux-gnu/11/include即可。

这样就可以正常使用新版本的clang编译器了,如果还有找不到的文件,也可以通过这样的方式添加路径。

编译器搜索路径有几个环境变量:C_INCLUDE_PATHCPLUS_INCLUDE_PATH以及CPATH。它们常被用于在编译C/C++时的搜索头文件的路径,其中C_INCLUDE_PATH仅对预处理C有效,CPLUS_INCLUDE_PATH仅对预处理C++有效,而CPATH对C和C++语言均有效。

这些环境变量可以在每个项目的CMakePresets.json来中使用如上方式设置,如果想一劳永逸地设置一次,则可以在~/.bashrc中使用export 指令来设置,比如:

export CPLUS_INCLUDE_PATH=/usr/lib/llvm-17/include/c++/v1:/usr/lib/gcc/x86_64-linux-gnu/11/include:/usr/lib/llvm-17/include/x86_64-
unknown-linux-gnu/c++/v1:${CPLUS_INCLUDE_PATH}

三、额外事项

1. 卸载从ubuntu的apt系统安装的clang和llvm

安装llvm-17后,如果不再使用llvm-15,则可以将之卸载掉:

sudo apt autoremove llvm-15
sudo apt autoremove clang-15

2、更新cmake和ninja

由于要使用C++ 20的模块特性,需要cmake 3.28版本及以上,ninja也需要更新,之前ubuntu中使用apt安装的cmake和ninja也可以一并卸载掉了。

1. 卸载

sudo apt autoremove cmake
sudo apt autoremove ninja-build

2. 下载安装cmake

从官方网站下载最新的版本进行安装。目前最新稳定版本为:cmake-3.28.3-linux-x86_64.sh

sudo mv cmake-3.28.3-linux-x86_64.sh  /usr/local
cd /usr/local
chmod +x cmake-3.28.3-linux-x86_64.sh 
./cmake-3.28.3-linux-x86_64.sh

Do you accept the license? [yn]: 时输入y

By default the CMake will be installed in:
  "/usr/local/cmake-3.28.3-linux-x86_64"
Do you want to include the subdirectory cmake-3.28.3-linux-x86_64?
Saying no will install in: "/usr/local" [Yn]: 

输入n安装到/usr/local目录,不用再建议软链接了。

3. 下载安装ninja

https://github.com/ninja-build/ninja/releases下载最新的ninja版本,它是一个zip文件,解压后放到PATH路径中,建议为/usr/local/bin:

sudo mv ninja /usr/local/bin

3、更新安装lldb-mi

由于前面已经卸载掉了llvm-15,如果之前安装的lldb-mi是基于llvm-15构建的,那就会报错:

lldb-mi: error while loading shared libraries: liblldb-15.so.1: cannot open shared object file: No such file or directory

https://github.com/lldb-tools/lldb-mi下载最新的源码,然后进行源码编译安装。

源码使用的是cmake构建系统,在源码根目录中执行下面的命令:

mkdir build
cd build
cmake ..

如果系统中没有相应的依赖库,在执行cmake ..的时候可能会报错:

CMake Error at /usr/lib/llvm-17/lib/cmake/llvm/LLVMExports.cmake:64 (set_target_properties):
  The link interface of target "LLVMSupport" contains:

    ZLIB::ZLIB

  but the target was not found.  Possible reasons include:

    * There is a typo in the target name.
    * A find_package call is missing for an IMPORTED target.
    * An ALIAS target is missing.

Call Stack (most recent call first):
  /usr/lib/llvm-17/lib/cmake/llvm/LLVMConfig.cmake:356 (include)
  CMakeLists.txt:15 (find_package)
报的依赖项ubuntu的安装包名
ZLIB::ZLIBzlib1g-dev
zstd::libzstd_sharedlibzstd-dev
Terminfo::terminfolibncurses5-dev libncursesw5-dev
LibXml2libxml2-dev

最后一项LibXml2报的不一样:
Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)

可以使用:

sudo apt install -y zlib1g-dev libzstd-dev libncurses5-dev libncursesw5-dev libxml2-dev

一次安装上述所有依赖库。

使用cmake ..配置好项目后,就可以使用cmake --build .构建了。

构建完成使用下面命令安装即可:

sudo cp ./src/lldb-mi /usr/local/bin/lldb-mi
sudo cp ./src/lldb-mi /usr/lib/llvm-17/bin/lldb-mi

复制到/usr/lib/llvm-17/bin/lldb-mi,是因为VSCode中的cmake插件启动调试器时是会检测该路径。

如果本文对你有所帮助,可以点赞收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值