当前位置: 首页 > 工具软件 > LibCXX > 使用案例 >

UBuntu源码安装clang llvm-link libcxx,及VSCode & CMake & Clang全套编译体系

骆磊
2023-12-01

(Ubuntu16)源码安装clang llvm-link libcxx libcxxabi,直接下载预编译的安装libcxx和libcxxabi好像要手动,所以放弃了

  • 先进入某个目录,先sudo输过密码,再粘贴下面的命令
[ -e llvm-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/llvm-7.0.1.src.tar.xz
[ -e cfe-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/cfe-7.0.1.src.tar.xz
[ -e compiler-rt-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/compiler-rt-7.0.1.src.tar.xz
[ -e libcxx-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/libcxx-7.0.1.src.tar.xz
[ -e libcxxabi-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/libcxxabi-7.0.1.src.tar.xz
[ -e libunwind-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/libunwind-7.0.1.src.tar.xz
[ -e lld-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/lld-7.0.1.src.tar.xz
[ -e lldb-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/lldb-7.0.1.src.tar.xz
[ -e openmp-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/openmp-7.0.1.src.tar.xz
[ -e polly-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/polly-7.0.1.src.tar.xz
[ -e clang-tools-extra-7.0.1.src.tar.xz ] || wget http://releases.llvm.org/7.0.1/clang-tools-extra-7.0.1.src.tar.xz
[ -e llvm-7.0.1.src ] || tar xf llvm-7.0.1.src.tar.xz
tar xf cfe-7.0.1.src.tar.xz && mv cfe-7.0.1.src/ llvm-7.0.1.src/tools/clang
tar xf lld-7.0.1.src.tar.xz && mv lld-7.0.1.src/ llvm-7.0.1.src/tools/lld
tar xf lldb-7.0.1.src.tar.xz && mv lldb-7.0.1.src/ llvm-7.0.1.src/tools/lldb
tar xf polly-7.0.1.src.tar.xz && mv polly-7.0.1.src/ llvm-7.0.1.src/tools/polly
tar xf clang-tools-extra-7.0.1.src.tar.xz && mv clang-tools-extra-7.0.1.src/ llvm-7.0.1.src/tools/clang/tools/extra
tar xf compiler-rt-7.0.1.src.tar.xz && mv compiler-rt-7.0.1.src/ llvm-7.0.1.src/projects/compiler-rt
tar xf libcxx-7.0.1.src.tar.xz && mv libcxx-7.0.1.src/ llvm-7.0.1.src/projects/libcxx
tar xf libcxxabi-7.0.1.src.tar.xz && mv libcxxabi-7.0.1.src/ llvm-7.0.1.src/projects/libcxxabi
tar xf libunwind-7.0.1.src.tar.xz && mv libunwind-7.0.1.src/ llvm-7.0.1.src/projects/libunwind
tar xf openmp-7.0.1.src.tar.xz && mv openmp-7.0.1.src/ llvm-7.0.1.src/projects/openmp

cd llvm-7.0.1.src/
mkdir llvm-build
cd llvm-build/

sudo /sbin/ldconfig
sudo apt install libncurses5-dev swig libedit-dev
cmake .. -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local 	\
-DCMAKE_BUILD_TYPE=RelWithDebInfo
make
make install
sudo ldconfig
  • 编译项目的CMakeLists.txt可以仿造:
cmake_minimum_required(VERSION 3.7) #ubuntu16+vscode最好源码安装最新cmake3.12

#项目名
project(testclang)

SET(CMAKE_CXX_COMPILER "clang++")
#设置链接器命令行:
#  -stdlib=libc++ -rtlib=compiler-rt -lunwind (libcxx可能会导致后面调试看不到std容器的内容,大家酌情使用)
SET(CMAKE_CXX_LINK_EXECUTABLE "clang++ -fuse-ld=lld -stdlib=libc++ -rtlib=compiler-rt -lunwind <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>")

#基本的编译参数
SET (CXX_FLAGS_Common "-std=c++2a -stdlib=libc++ -fms-extensions ")

#可选:
#   -fcoroutines-ts 开启coroutine
#   -fno-omit-frame-pointer 不省略帧指针
#   -mcx16 开启16位原子交换函数
SET (CMAKE_CXX_FLAGS "${CXX_FLAGS_Common} -fcoroutines-ts -fno-omit-frame-pointer -mcx16")
SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

#include_directories()
#add_definitions()

#file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")

add_executable(testclang testclang.cpp)

-stdlib=libc++ -rtlib=compiler-rt -lunwind 决定使用libcxx (使用libcxx可能会导致后面调试看不到std容器的内容,大家酌情使用)
-fms-extensions开启mscv扩展支持,可以使用__if_exists语法和Interlocked系列函数等
-mcx16可以开启128位变量的原子操作_InterlockedCompareExchange128

  • .vscode目录下c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/include/c++/v1/**",
                "/usr/include/x86_64-linux-gnu/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64",
            "configurationProvider": "go2sh.cmake-integration"
        }
    ],
    "version": 4
}

vscode需要插件,我这里安装了
C++
CMake, CMake Integration, CMake Tools, CMake Tools Helper
Include Autocomplete,
vscode-clangd (这东西不知道为什么不支持__if_exists,多几行警告,问题不大)
clang-include-fixer
clang-Format
C/C++ Clang Command Adapter
codecpp-full是个集合,会自动安装其他插件,但是后面我把他禁用了也没有问题
ClangComplete已禁用,似乎没有缺功能

  • .vscode下launch.json,包含cppdbg的gdb调试模式,lldb调试模式,和codelldb插件的调试模式。并展示了natvis或pretty-printing。
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bin/testclang",
            "args": ["4"],
            
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "miDebuggerArgs":"-q",
            "visualizerFile": "${workspaceRoot}/stl.natvis", //从vs找一份linux版stl可视化文件
            "showDisplayString": true,
            "setupCommands": [
                // {
                //     "description": "Enable pretty-printing for gdb",
                //     "text": "-enable-pretty-printing",
                //     "ignoreFailures": true
                // }
            ]
        },
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bin/testclang",
            "args": ["4"],

            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerArgs":"-q",
            "visualizerFile": "${workspaceRoot}/stl.natvis", //从vs找一份linux版stl可视化文件
            "showDisplayString": true,
            "setupCommands": [ //屏蔽pretty-printing就能使用natvis方式,自选
                // {
                //     "description": "Enable pretty-printing for gdb",
                //     "text": "-enable-pretty-printing",
                //     "ignoreFailures": true
                // }
            ]
        },
        {
            "name": "Launch lldb",  // CodeLLDB插件,功能和cppdbg的lldb模式各有千秋
            "type": "lldb",
            "request": "launch",
            "program": "${workspaceFolder}/bin/testclang",
            "args":[],
            "initCommands": [
                "command script import ${workspaceRoot}/debugvis.py"
            ]
        }
    ]
}

“miDebuggerArgs”:"-q" 可以启动调试器时少输出垃圾信息
“MIMode”: "lldb"可以切换到lldb,默认gdb。lldb有利有弊。
testclang是可执行文件名
[“4”]是个数组表示传入“4”作为目标程序的启动参数
“externalConsole”: false 可以在vscode集成的控制台里运行


clang+llvm编译过程参考 https://blog.csdn.net/snsn1984/article/details/86438880
ubuntu16升级cmake参考 https://blog.csdn.net/dieju8330/article/details/85552778

如果有人按照上述过程出现了问题,请在这里留言讨论。

 类似资料: