ubuntu16.04 VSCode下cmake+clang+lldb调试c++

ubuntu16.04 VSCode下cmake+clang+lldb调试c++

一、CMakeLists使用

二、Doxygen的使用-用于生成代码文档的工具

三、ubuntu16.04 VSCode下cmake+clang+lldb调试c++

四、Git使用教程-分支使用/合并分支提交



3.1.安装clang+clangd+cmake

sudo apt install clang clangd cmake

3.2、打开VSCode,安装扩展插件

Chinese(Simplified)(简体中文)、Clangd、CMake、CMake Tools、CodeLLB、OutputColorizer

注意:C/C++ 、Code Runner若安装,需要禁用。因为会和Clang有冲突

VScode插件:
60 个神级 VS Code 插件!

3.3、编译

左下角在这里插入图片描述选择“生成”,跳出选项选择"Clang 3.8.0 x86_64-pc-linux-gnu"

3.4、Debug

点击左方Debug在这里插入图片描述

3.4.1 创建launch.json。

修改 "program"的路径–可执行文件的路径

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program":"${workspaceFolder}/build/test1",
            "args":[],
            "cwd":"${workspaceFolder}"
        }

    ]
}

3.4.2 配置setting.json

{
"cmake.showOptionsMovedNotification": false,
 "clangd.path": "/home/xxx/.config/Code/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/install/18.1.3/clangd_18.1.3/bin/clangd",
"clangd.arguments": [
        "--background-index",
        "--compile-commands-dir=${workspaceFolder}/build",
        "--clang-tidy",
        "--completion-style=detailed",
        "--header-insertion=iwyu",
        "--query-driver=/usr/bin/clang"
    ],
    }

3.5. vscode安装配置clang-format插件

3.5.1 Linux系统安装clang-format

sudo apt install clang-format

3.5.2 vscode安装clang-format插件

在vscode扩展里搜索clang-format,安装排名第一的xaver.clang-format

3.5.3 确认clang-format可执行程序路径

Linux命令which clang-format查询clang-format的安装路径,如:/usr/bin/clang-format

which clang-format

3.5.4 settings.json添加配置

{
    // clang-format 扩展的配置
    "clang-format.style" : "file",
    // format 配置路径
    "clang-format.assumeFilename": "${workspaceFolder}/.vscode/format/.clang-format",
    "clang-format.executable": "/usr/bin/clang-format",
    "clang-format.fallbackStyle": "Google",
    "editor.defaultFormatter": "xaver.clang-format"
}

3.5.5 使用clang-format命令

//格式名可选:LLVM, Google, Chromium, Mozilla, WebKit, microsoft
 // 以google中的代码风格格式化main.cpp, 结果直接写到main.cpp
 clang-format -style=google -i main.cpp
 // 当然也支持对指定行格式化,格式化main.cpp的第1,2行
 clang-format -lines=1:2 main.cpp

3.5.6 自定义的格式化配置

1)生成.clang-format 配置文件并修改自定义

clang-format -style=Google  -dump-config > ./.clang-format

运行上述命令,就能生成.clang-format文件。

2)使用命令格式化

clang-format -style=file -i main.cpp 

或者

clang-format -i main.cpp 

或者

clang-format --assume-filename=.clang-format -i main.cpp

基于google的风格进行定制

---
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle:   LLVM
Language:        Cpp
# this style configuration is based on google style configuration.
# The following configuration is different from the basic configuration.
# 缩进宽度
IndentWidth:     4
# 访问权限说明符(public/private等)的偏移
AccessModifierOffset: -4
# # 开括号(开圆括号、尖括号、方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
# AlignAfterOpenBracket: Align
# # 连续赋值时,对齐所有等号
# AlignConsecutiveAssignments: false
# # 连续声明时,对齐所有声明的变量名
# AlignConsecutiveDeclarations: false
# 反斜杆换行的对齐方式
# -- DontAlign - 不进行对齐
# -- Left - 反斜杠靠左对齐
# -- Right - 反斜杠靠右对齐
# AlignEscapedNewlines: Right
# 二元、三元表达式的对齐方式(当表达式需要占用多行时)
# -- DontAlign - 不进行对齐
# -- Align - 从操作符开始对齐
# -- AlignAfterOperator - 从操作数开始对齐
AlignOperands:   true
# # 是否对齐行尾注释
# AlignTrailingComments: true
# # 函数声明的所有参数在放在下一行
# AllowAllParametersOfDeclarationOnNextLine: false
# # 是否允许短的代码块放在同一行
# AllowShortBlocksOnASingleLine: false
# # 短的case标签和语句放在同一行
# AllowShortCaseLabelsOnASingleLine: true
# # 短的函数放在同一行
# -- None - 不把短的函数放在同一行
# -- InlineOnly - 只把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- Empty - 只把空的函数放在同一行
# -- Inline - 把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- All - 都允许放在同一行
AllowShortFunctionsOnASingleLine: InlineOnly
# # 短的if语句保持在同一行
# AllowShortIfStatementsOnASingleLine: true
# # 短的循环保持在同一行
# AllowShortLoopsOnASingleLine: true
# # 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), 
# # AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
# AlwaysBreakAfterReturnType: None
# # 总是在多行string字面量前换行
# AlwaysBreakBeforeMultilineStrings: true
# # 总是在template声明后换行
AlwaysBreakTemplateDeclarations: true
# # 函数调用时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
# BinPackArguments: true
# 函数声明、定义时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
# BinPackParameters: true
# 大括号放置风格
# -- Attach - 大括号紧随前方内容,放在同一行
# -- Linux - 与 Attach 类似,除了 函数、命名空间、类定义 的大括号放在下一行
# -- Mozilla - 与 Attach 类似,除了枚举、函数、结构(class\struct\union)的大括号放在下一行
# -- Stroustrup - 与 Attach 类似,但函数定义前、catch前方、else前方的"{}"放在单独一行
# -- Allman - 总是换行
# -- Whitesmiths - 类似 Allman,但"{}"和内部的语句对齐到同样位置
# -- GNU - 总是换行,但在控制语句后的"{}"总是对齐到下一个位置
# -- WebKit - 与 Attach 类似,但在函数定义前换行 
# -- Custom - 依赖 BraceWrapping
#   注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
  # class定义后面
  AfterClass: true
  # 控制语句后面
  AfterControlStatement: false
  # enum定义后面
  AfterEnum: false
  # 函数定义后面
  AfterFunction: true
  # 命名空间定义后面
  AfterNamespace: true
  # ObjC定义后面
  AfterObjCDeclaration: false
  # struct定义后面
  AfterStruct: false
  # union定义后面
  AfterUnion: false
  # extern之后
  AfterExternBlock: true
  # catch之前
  BeforeCatch: false
  # else之前
  BeforeElse: false
  # 继续缩进大括号
  IndentBraces: false
  # 分离空函数
  # # 当空白函数的"{}"和函数名称不需要放在同一行时,是否拆分函数体
  SplitEmptyFunction: true
  # 分离空语句
  # # 当空白结构(class\struct\union)的"{}"需要放在单独的行时,是否拆分"{}"
  SplitEmptyRecord: true
  # 分离空命名空间
  # # 当空白的命名空间的"{}"需要放在单独的行时,是否拆分"{}"
  SplitEmptyNamespace: true
# # 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: NonAssignment
# BreakBeforeInheritanceComma: false
# # 在三元运算符前换行
# 当三元表达式不能放在同一行时,是否在三元操作符前方换行
# -- true - 操作符位于新行的首部
# -- false - 操作符位于上一行的尾部
BreakBeforeTernaryOperators: true
# BreakConstructorInitializersBeforeComma: false
# # 构造函数初始化列表分割方式
# -- BeforeColon - 在冒号 ':' 前方分割,冒号位于行首,逗号','位于行尾
# -- BeforeComma - 在冒号和逗号前方分割,冒号和逗号都位于行首,并且对齐 
# -- AfterColon - 在冒号和逗号后方分割,冒号和逗号位于行尾
BreakConstructorInitializers: BeforeColon
# # 是否在每个java注解后方换行
# BreakAfterJavaFieldAnnotations: false
# # 是否分割过长的字符串
# BreakStringLiterals: false
# # 每行字符长度的限制,0表示没有限制
ColumnLimit:     100
# # 用于匹配注释信息的正则表达式,被匹配的行不会做任何修改
# CommentPragmas:  '^ IWYU pragma:'
# 是否压缩紧接的命名空间
# -- true - 将紧跟的命名空间放在同一行
# -- false - 每个命名空间位于新的一行
CompactNamespaces: false
# # 构造函数的初始化列表要么都在同一行,要么都各自一行
# -- true - 如果可能,初始化列表放在同一行;如果不满足长度选择,则每个单独放一行
# -- false - 初始化列表可以随意放置
# ConstructorInitializerAllOnOneLineOrOnePerLine: false
# # 构造函数的初始化列表和基类集成列表的对齐宽度
ConstructorInitializerIndentWidth: 4
# # 延续语句的对齐宽度
ContinuationIndentWidth: 4
# # 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: true
# 是否自动分析指针的对齐方式
# -- true - 自动分析并使用指针的对齐方式,若无法分析,则使用 PointerAlignment
# -- false - 不自动分析
# DerivePointerAlignment: true
# 是否禁用格式化
DisableFormat:   false
# ExperimentalAutoDetectBinPacking: false
# 是否自动修正命名空间的结束注释
# -- true - 在短的命名空间尾部,自动添加或修改错误的命名空间结束注释
# -- false - 不自动修正
FixNamespaceComments: true
# foreach 循环
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
# 多个 include 块(有空行分隔的include)排序时的分组规则
# -- Preserve - 保留原有的块分隔,各自排序
# -- Merge - 将所有的块视为同一个,然后进行排序
# -- Regroup - 将所有的块视为同一个进行排序,然后按照 IncludeCategories 的规则进行分组
IncludeBlocks:   Preserve
# IncludeCategories: 
#   - Regex:           '^<ext/.*\.h>'
#     Priority:        2
#   - Regex:           '^<.*\.h>'
#     Priority:        1
#   - Regex:           '^<.*'
#     Priority:        2
#   - Regex:           '.*'
#     Priority:        3
# IncludeIsMainRegex: '([-_](test|unittest))?$'
# # 缩进case标签
# -- true - case 不与 switch 对齐
# -- false - case 和 switch 对齐
IndentCaseLabels: true
# 预处理命令(#if\#ifdef\#endif等)的缩进规则
# -- None - 不进行缩进
# -- AfterHash - 在前导'#'后缩进,'#'放在最左侧,之后的语句参与缩进
# -- BeforeHash - 在前导'#'前进行缩进
IndentPPDirectives: AfterHash
# # 函数返回类型换行时,缩进函数声明或函数定义的函数名
# IndentWrappedFunctionNames: false
# JavaScript 中的字符串引号规则
# -- Leave - 保持原样
# -- Single - 全部使用单引号
# -- Double - 全部使用双引号 
JavaScriptQuotes: Leave
# 是否在 JavaScript 的 import/export 语句后换行
# JavaScriptWrapImports: true
# # 保留在块开始处的空行
# -- true - 保留块起始的空行
# -- false - 删除块起始的空行
KeepEmptyLinesAtTheStartOfBlocks: true
# 用于识别宏定义型块起始的正则表达式
# MacroBlockBegin: ''
# 用于识别宏定义型块结束的正则表达式
# MacroBlockEnd:   ''
# # 连续空行的最大数量
MaxEmptyLinesToKeep: 1
# # 命名空间内部的缩进规则
# -- None - 都不缩进
# -- Inner - 只缩进嵌套的命名空间内容
# -- All - 缩进所有命名空间内容
NamespaceIndentation: Inner
# Objective-C 相关配置
# ObjCBlockIndentWidth: 2
# ObjCSpaceAfterProperty: false
# ObjCSpaceBeforeProtocolList: false
# PenaltyBreakAssignment: 2
# PenaltyBreakBeforeFirstCallParameter: 1
# PenaltyBreakComment: 300
# PenaltyBreakFirstLessLess: 120
# PenaltyBreakString: 1000
# PenaltyExcessCharacter: 1000000
# PenaltyReturnTypeOnItsOwnLine: 200
# # 指针和引用(*和&)的对齐规则
# -- Left - * 靠近左侧
# -- Right - * 靠近右侧
# -- Middle - * 放在中间
# NOTE : 在 SpaceAroundPointerQualifiers 为 Default,
# 	 且 DerivePointerAlignment 失效后启用
PointerAlignment: Right
# RawStringFormats: 
#   - Delimiter:       pb
#     Language:        TextProto
#     BasedOnStyle:    google
# # 重新排版注释
ReflowComments:  false
# # 重新排序#include
# -- Never - 不进行排序
# -- CaseSensitive - 排序时大小写敏感
# -- CaseInsensitive - 排序时大小写不敏感
SortIncludes:    false
# java 中静态 import 的排序规则
# -- Before - 静态放在非静态前方
# -- After - 静态放在非静态后方
# SortJavaStaticImport: Before
# # 重新排序using声明
SortUsingDeclarations: false
# # 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false
# # 在Template关键字后面添加空格
SpaceAfterTemplateKeyword: true
# # 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true
# # 在 C++11 的初始化列表前加空格
# SpaceBeforeCpp11BracedList: true
# 在构造函数的初始化冒号":"前加空格
# SpaceBeforeCtorInitializerColon: true
# 在构造函数的继承冒号":"前加空格
# SpaceBeforeInheritanceColon: true
# 小括号"()"前加空格的规则
# -- Never - 从不加空格
# -- ControlStatements - 只在控制语句(for/if/while...)时加空格
# -- ControlStatementsExceptForEachMacros - 类型 ControlStatements,只是不再 ForEach 后加空格
# -- Always - 总是添加空格
# -- NonEmptyParentheses - 类似 Always,只是不再空白括号前加空格  
SpaceBeforeParens: ControlStatements
# 在 for 循环的冒号":"前加空格
# SpaceBeforeRangeBasedForLoopColon: true
# # 在空白的小括号"()"中添加空格
SpaceInEmptyParentheses: false
# # 在行尾的注释前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1
# # 在尖括号的"<"后,和">"前添加空格
SpacesInAngles:  false
# # 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true
# # 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false
# # 在圆括号的"("后,和")"前添加空格
SpacesInParentheses: false
# 在中括号中加空格
# 当中括号内没有数据时,不受本规则影响(如空白的lambda 捕获表、不定长度的数组声明)
SpacesInSquareBrackets: false
# 语言标准: Cpp03, Cpp11, Auto
Standard: Auto
# # tab宽度
TabWidth: 4
# # 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never
---

3.6.参考

  1. vscode安装配置clang-format插件及使用小结
  2. c语言 clang-format
  3. Clang-format格式化及配置参数
  4. vscode设置C++代码格式化(Clang-Format)
  5. Clang-Format用法详解
<think>好的,我现在需要帮助用户在Ubuntu 16.04上安装Clang++ 14。首先,用户提供的引用资料里提到了一些关于安装Clang不同版本的信息,但都是关于较旧版本的,比如3.6或者通过apt安装的默认版本。而用户需要的是Clang++ 14,这是一个比较新的版本,而Ubuntu 16.04的官方仓库可能没有直接支持。 首先,我应该考虑Ubuntu 16.04的软件源是否包含Clang 14。根据经验,Ubuntu的官方仓库通常不会提供太新的软件版本,尤其是对于已经停止支持的发行版。Ubuntu 16.04在2021年4月已经结束了标准支持,所以很可能需要第三方源或者手动安装。 接下来,查看用户提供的引用内容,引用[2]和[3]提到在Ubuntu 16.04下通过apt安装clang-format和clang,但版本可能较低。比如引用[3]中安装的是clangclangd,但没有说明具体版本,可能默认是系统仓库里的旧版。因此,我需要寻找其他方法。 一种常见的方法是使用LLVM的官方APT仓库。LLVM提供了不同版本的预编译包,可能支持旧版Ubuntu。用户需要添加LLVM的APT源,然后安装Clang 14。但需要确认该仓库是否支持Ubuntu 16.04(代号Xenial)。可能需要检查LLVM官网的说明。 另外,如果官方仓库不支持,可能需要手动下载Clang 14的二进制文件或者从源码编译。但编译源码对用户来说可能比较复杂,特别是如果用户不熟悉构建过程的话。所以优先考虑添加第三方源。 现在,我应该指导用户添加LLVM的APT仓库。通常步骤是: 1. 下载并安装LLVM的GPG密钥。 2. 添加仓库地址到sources.list。 3. 更新软件包列表。 4. 安装clang-14。 但需要确认该仓库是否支持Xenial。例如,LLVM的APT仓库可能只支持较新的Ubuntu版本。如果不行,可能需要使用其他方法,比如使用Ubuntu Toolchain PPA,或者通过snap安装。 另外,用户可能需要安装libstdc++或libc++,如引用[4]所述,但Clang 14可能需要更高版本的库,可能需要处理依赖关系。 可能的步骤: 1. 添加LLVM的APT仓库,如果支持Xenial的话。 2. 安装Clang 14及相关工具。 3. 处理可能的依赖问题,比如libstdc++的版本。 但需要验证Xenial是否在LLVM的APT支持列表中。例如,访问https://apt.llvm.org/查看支持的发行版。假设Xenial不在其中,那么可能需要手动安装。 另一种方法是使用预编译的二进制文件。从releases.llvm.org下载Clang 14的二进制包,解压并添加到PATH中。这可能需要用户手动设置环境变量,或者使用符号链接。 例如: wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.0/clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz 解压后,将bin目录加入PATH。 但需要注意,该二进制是否适用于Ubuntu 16.04,可能依赖的库版本是否满足。如果二进制是针对Ubuntu 18.04构建的,可能在16.04上运行时出现glibc版本不兼容的问题。例如,Ubuntu 16.04的glibc版本是2.23,而18.04的是2.27,如果Clang 14需要更高版本的glibc,则无法运行。 这时可能需要考虑从源码编译Clang 14,但编译过程较为复杂,特别是对于不熟悉的用户来说可能有困难。 还有一种可能,使用第三方PPA,比如Ubuntu Toolchain的测试仓库,但需要检查是否有Clang 14的PPA支持Xenial。 总结可能的步骤: - 尝试通过LLVM的APT仓库安装,如果支持。 - 如果不行,尝试下载预编译的二进制文件,检查依赖。 - 若依赖不满足,考虑源码编译或使用其他方法。 现在,我需要根据这些可能性,给出用户一个可行的步骤。假设用户无法通过APT安装,那么手动下载预编译的二进制可能是更简单的方式,但需要处理依赖问题。或者建议用户升级到更高版本的Ubuntu以获得更好的支持。 在用户提供的引用中,引用[1]提到在Ubuntu上安装clang++3.6时遇到问题,但用户需要的是14版本,所以可能需要不同的方法。引用[4]提到libc++和libstdc++的区别,可能需要安装对应的库。 因此,步骤可能包括: 1. 添加LLVM的APT仓库: wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo add-apt-repository 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-14 main' sudo apt update sudo apt install clang-14 但需要确认该仓库是否存在xenial的版本。例如,访问https://apt.llvm.org/,查看是否有针对Xenial的14版本。假设存在的话,可以继续。 如果不存在,可能需要修改为其他代号,比如用bionic(18.04)的仓库,但可能不兼容。 比如,尝试使用: deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-14 main 但不确定是否存在该仓库。如果不存在,则这种方法不可行。 如果无法通过APT安装,则考虑手动下载二进制包: 从https://releases.llvm.org/download.html#14.0.0下载适用于Ubuntu的预编译版本,例如选择Clang 14.0.0的Pre-Built Binaries: x86_64-linux-gnu-ubuntu-18.04,解压后设置环境变量。 但需要检查glibc的版本: 在Ubuntu 16.04终端运行: ldd --version 如果输出显示glibc 2.23,而预编译的二进制可能需要更高版本,则无法运行。例如,Ubuntu 18.04的glibc是2.27,所以Clang 14的二进制可能需要glibc >=2.27,导致无法在16.04上运行。 这时可能需要从源码编译Clang,或者使用Docker容器等其他方法。 如果用户坚持在Ubuntu 16.04上安装,可能需要编译Clang 14的源码。步骤如下: 安装依赖: sudo apt update sudo apt install build-essential cmake ninja-build git 下载源码: git clone https://github.com/llvm/llvm-project.git cd llvm-project git checkout release/14.x 编译: mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" ../llvm make -j$(nproc) sudo make install 这个过程可能需要较长时间,且可能出现依赖问题,需要处理。 因此,综合来看,可能的解决方案包括: 1. 添加LLVM官方APT仓库,如果支持Xenial。 2. 使用预编译的二进制(可能不兼容)。 3. 从源码编译。 4. 建议升级Ubuntu版本或使用Docker。 现在需要根据用户的情况给出建议。如果用户无法升级系统,可能需要源码编译。如果用户愿意使用其他方法,可能更简单。 最终,回答应分步骤指导用户如何安装,可能包括APT方法(如果可行),或手动安装方法,并指出可能的依赖问题。</think>要在Ubuntu 16.04上安装Clang++ 14,由于该版本已结束官方支持且软件仓库未提供Clang 14,需通过以下步骤手动安装: --- ### **方法1:使用LLVM官方APT仓库(若支持)** 1. **添加LLVM仓库密钥** 执行以下命令添加GPG密钥: ```bash wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - ``` 2. **添加仓库地址** 创建新的源文件(需确认仓库是否支持`xenial`): ```bash sudo nano /etc/apt/sources.list.d/llvm.list ``` 添加以下内容(若仓库支持): ```plaintext deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-14 main ``` 3. **更新并安装** ```bash sudo apt update sudo apt install clang-14 ``` 若仓库不可用,需改用其他方法。 --- ### **方法2:手动安装预编译二进制** 1. **下载二进制包** 从[LLVM官网](https://releases.llvm.org/download.html#14.0.0)下载适用于Linux的Clang 14预编译包(如`clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz`): ```bash wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.0/clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz ``` 2. **解压并配置环境** ```bash tar xvf clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz sudo mv clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04 /opt/clang14 echo 'export PATH="/opt/clang14/bin:$PATH"' >> ~/.bashrc source ~/.bashrc ``` **注意**:若系统依赖库版本过低(如glibc < 2.27),可能无法运行[^4]。 --- ### **方法3:从源码编译(兼容性最佳)** 1. **安装编译依赖** ```bash sudo apt install build-essential cmake ninja-build git ``` 2. **下载源码并编译** ```bash git clone https://github.com/llvm/llvm-project.git cd llvm-project git checkout release/14.x mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" ../llvm make -j$(nproc) sudo make install ``` 此过程耗时较长(约1-2小时),需确保磁盘空间充足。 --- ### **验证安装** 执行以下命令检查版本: ```bash clang++ --version ``` 若输出包含`Clang 14.0.0`,则安装成功。 --- ### **依赖问题处理** - **libstdc++版本过低**:升级GCC或手动安装高版本库。 - **glibc兼容性问题**:若预编译包无法运行,需升级系统或改用源码编译。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢天喜地小姐姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值