(Ubuntu16)源码安装clang llvm-link libcxx libcxxabi,直接下载预编译的安装libcxx和libcxxabi好像要手动,所以放弃了
[ -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
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
{
"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已禁用,似乎没有缺功能
{
// 使用 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
如果有人按照上述过程出现了问题,请在这里留言讨论。