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_PATH
、CPLUS_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::ZLIB | zlib1g-dev |
zstd::libzstd_shared | libzstd-dev |
Terminfo::terminfo | libncurses5-dev libncursesw5-dev |
LibXml2 | libxml2-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插件启动调试器时是会检测该路径。
如果本文对你有所帮助,可以点赞收藏!