1. Clang介绍:
一、Clang简介
简单来说,Clang是一个编译器,目前用来编译C、C++、Objective-C语言。
更进一步来说,Clang只是一个编译器前端,其将上述的C类语言编译成一种“汇编语言(中间语言)”。接着,通过LLVM(Low Level Virtual Machine)作为后端,将这种“汇编语言”编译成针对不同机器的二进制机器语言。
Clang是在类BSD许可证下发布,所以不必担心像GPL下发布的GCC那样,不能在商业软件中使用。
二、Clang/LLVM的特性
真正的自由!
Clang是在类BSD许可证下发布,所以不必担心像GPL下发布的GCC那样,不能在商业软件中使用。而GPL的“自由”,以我的观点,就是象牙塔里的“自由”。而真正推动社会进步的力量,其中很重要的一步是经济力量。虽然GPL没有禁止软件的商业用途,但是其强制开放源码的策略,让许多试图在部分闭源的软件中使用开源软件公司望而却步。
当然,这仅仅从商业上的软件重用的角度来看待问题的。在刺激和保障开源软件的连续性上,GPL的用途是不可磨灭的。
方面的学习
GCC的参与者众多,代码参差不齐,开发年限很长,因而庞大而臃肿,对于试图初学编译器相关知识的朋友来说,阅读GCC的源码会让人有点不知所措。而Clang却轻盈许多,代码简单易懂,占用内存小。
根据Apostolou Dimitrios于2011年7月5日在GCC开发邮件列表中GSOC-Student Roundup的邮件中所说的一段话:“对我来说,阅读GCC代码库已变得非常困难。事实上这是我唯一所知道的随着时间的流逝而变得越来越复杂的项目”(译自维基百科)
如果想学习编译器的相关知识,不妨尝试阅读Clang/LLVM的代码。
相比于 GCC,Clang 具有如下优点:(摘自结构化编译器前端 Clang 介绍)
编译速度快:在某些平台上,Clang 的编译速度显著的快过 GCC。
占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右。
模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用。
诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告。
设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
当前 Clang 还处在不断完善过程中,相比于 GCC, Clang 在以下方面还需要加强:
支持更多语言:GCC 除了支持 C/C++/Objective-C, 还支持 Fortran/Pascal/Java/Ada/Go 和其他语言。Clang 目前支持的语言有 C/C++/Objective-C/Objective-C++。
加强对 C++ 的支持:Clang 对 C++ 的支持依然落后于 GCC,Clang 还需要加强对 C++ 提供全方位支持。
支持更多平台:GCC 流行的时间比较长,已经被广泛使用,对各种平台的支持也很完备。Clang 目前支持的平台有 Linux/Windows/Mac OS。
另外,FreeBSD10计划以Clang来代替GCC。
2.安装 Clang 和 Clangd:
clangd 官方文档地址: Getting started
sudo apt update
sudo apt-get install clang
sudo apt-get install clangd-12
clang
是一个 C、C++ 和 Objective-C 编译器,主要用于将源代码编译为可执行文件或目标代码。
clangd
则是基于 clang
的语言服务器。它的主要作用不是编译代码,而是为集成开发环境(IDE)或编辑器(如 Visual Studio Code)提供语言相关的智能服务,如代码补全、错误诊断、代码导航、重构建议等,以增强开发体验和提高开发效率。
总的来说,clang
专注于编译代码,而 clangd
侧重于为开发过程提供语言层面的辅助和支持。
Clang版本所支持的C++版本如下:
3. VS Code Clang开发环境配置
1.安装 vscode-clangd VS Code 插件:
2.安装 “C/C++ Clang Command Adapter” 插件:
在 VS Code 中,打开扩展视图(点击侧边栏的扩展图标或使用快捷键 Ctrl+Shift+X
),搜索并安装官方的 "C/C++ Clang Command Adapter " 扩展。
3.配置 c_cpp_properties.json:
指定 Clang 作为编译器。通常,这个文件位于 .vscode
文件夹中,并且可以通过命令面板(Ctrl+Shift+P
)中的 "C/C++: Edit Configurations (JSON)" 命令来编辑。
{
"configurations": [
{
"name": "Ubuntu",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/clang++",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 1
}
请确保 "compilerPath"
指向正确的 Clang 可执行文件路径。在大多数 Linux 发行版中,Clang 的默认安装路径是 /usr/bin/clang
。
4.配置 tasks.json
:
如果需要自定义构建任务,可以编辑 tasks.json
文件。这个文件也位于 .vscode
文件夹中,可以通过命令面板中的 "Tasks: Configure Task" 命令来创建或编辑。
在 tasks.json
文件中,你可以定义一个任务来使用 Clang 编译你的项目:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
编译多个cpp文件,需要修改tasks.json文件。去除-o,修改-g单个cpp文件,为/*.cpp. Src为笔者工程放置cpp文件夹地址,根据
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "make",
"args": []
},
{
"label": "build",
"dependsOrder": "sequence",
"dependsOn": [
"cmake",
"make"
]
},
{
"type": "cppbuild",
"label": "C/C++: gcc build active file",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "Task generated by Debugger."
},
{
"label": "build clang",
"type": "shell",
"command": "clang",
"args": [
"-Wall",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${file}",
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-I",
"${workspaceFolder}/**",
"${workspaceFolder}/include/**",
"/usr/include",
"/usr/include/c++/11",
"/usr/include/x86_64-linux-gnu/c++/11",
"/usr/include/c++/11/backward",
"/usr/lib/gcc/x86_64-linux-gnu/11/include",
"/usr/local/include",
"/usr/include/x86_64-linux-gnu",
"-Wall",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${workspaceFolder}/src/*.cpp"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
5.配置 launch.json
:
{
"version": "1.0.0",
"configurations": [
{
"name": "Clang Build and Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: clang++ build active file"
}
]
}
VS Code 的 C/C++ 扩展使用 LLVM Clangd 提供智能感知功能,而 Clang Command Adapter 允许你使用 Clang 作为编译器和调试器。确保你安装了最新版本的 Clang,以获得最佳支持。
Alt+Shift+f
来格式化你的代码,把代码风格统一。
参考文章:
https://blog.youkuaiyun.com/qq_43331089/article/details/124573223