一、安装依赖项
Ubuntu下安装如下依赖或工具
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build git python3 zlib1g-dev libncurses5-dev libssl-dev
build-essential
: 包含编译 C++ 源代码所需的基本工具。cmake
: 用于生成编译文件的构建工具。
Windows下需要推荐使用minGW编译,minGW中安装如下依赖库或工具
pacman -Syu
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-ninja
pacman -S git
pacman -S mingw-w64-x86_64-python
pacman -S mingw-w64-x86_64-zlib
pacman -S mingw-w64-x86_64-ncurses
pacman -S mingw-w64-x86_64-openssl
二、克隆 LLVM 源代码
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
三、创建build目录并进入配置构建项
mkdir build
cd build
cmake -G "Ninja" \
-DCMAKE_CXX_FLAGS="-frtti" \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DLLVM_ENABLE_RTTI=ON \
../llvm
note: 由于我需要使用clang的ast(抽象语法树)的功能,因此必须使能rtti模块,cmake中使能-DLLVM_ENABLE_RTTI=ON可能没有用,因此使用-DCMAKE_CXX_FLAGS="-frtti"来强制保证开启了rtti。
四、编译并安装
ninja -j$(nproc) // 其中nproc指定并行bian编译cpu数
sudo ninja install -j$(nproc)
五、验证安装
llvm-config --version
clang --version
六、使用llvm clang识别工程需要注意的事项
C++程序利用llvm、clang库进行语法树解析识别时,需要注意的是,系统环境下的头文件路径默认不会包含在cmake所生辰的json中,需要指定,通过以下脚本能够获取到默认的系统头文件路径
echo "" | cpp -v 2>&1 | tee cpp_output.txt
awk '/#include <...> search starts here:/,/End of search list./' cpp_output.txt | sed '1d;$d' | tr -d ' ' > include_paths.txt
include_paths=$(awk '{ printf "-I%s ", $0 }' include_paths.txt)
echo "find system include path: ${include_paths}"
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_CXX_FLAGS="${include_paths}" \
-DCMAKE_C_FLAGS="${include_paths}" \
..