From 1418deaf6032afcd8dd03839cfff1135f2329ffc Mon Sep 17 00:00:00 2001 From: zhaoge <85532106+zhaogewudi666@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:15:36 +0800 Subject: [PATCH 1/7] Improve Clang installation instructions and directory layout Clarify the recommended installation method for Clang by using a dedicated directory under /usr/local, instead of copying binaries directly into system paths. Updated PATH explanation, removed unsafe practices, and improved overall clarity and maintainability of the documentation. --- docs/Ch03/index.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index 2e1db8b4..825505bc 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -454,23 +454,36 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 (Output omitted) ``` - 这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 那样在任何地方都可以直接运行。我们可以这样做: + 这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 命令那样在任何地方都可以直接运行。我们可以这样做: ```console - $ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 目录下的所有内容复制到 /usr/local/ 下。 - $ sudo cp -R * /usr/local/ + $ # 在 /usr/loacl/ 目录下新建 clang-10.0.0 目录。 + $ sudo mkdir /usr/local/clang-10.0.0 + $ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 整个目录复制到新建的 /usr/local/clang-10.0.0 下。 + $ sudo cp -R * /usr/local/clang-10.0.0 + $ echo 'export PATH=/usr/local/clang-10.0.0/bin:$PATH' >> ~/.bashrc + $ source ~/.bashrc ``` - 为什么是 `/usr/local` 呢?因为 `/usr/local/bin` 处在 PATH 环境变量下。当我们在终端输入命令时,终端会先判断是否为终端的内建命令,如果不是,则会在 $PATH 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 $PATH 中的目录下面,我们就可以像 `apt` 一样,在任意地方调用我们的程序。 + 在这里我们需要知道什么是 `PATH` 变量,当我们在终端输入命令时,终端会先判断是否为终端的内建命令,如果不是,则会在 `$PATH` 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 `$PATH` 中的目录下面,我们就可以像 `apt` 一样,在任意地方调用我们的程序。 + 那为什么是不直接将 `clang` 目录下的内容直接复制到 `/usr/local` 下呢?这么做虽然能让 `clang/bin` 目录下的二进制文件与 `/usr/local/bin/` 合并,从而实现“到处可调用”,但同时也会把解压的 `clang` 目录下的 `lib`、`include`、`share` 等目录混入系统已有的 `/usr/local/lib`、`/usr/local/include` 等目录中。 + 这种方法虽然是最简单最省事的,但是这种方法却忽略了 `linux` 系统最重要的系统管理问题,这种直接将外部编译的 `clang` 的二进制文件和依赖库文件加入到系统的执行目录和依赖中,针对于软件的版本管理和后续的维护卸载几乎成为了不可能,你会根本无法区分哪些文件属于外部编译的 `clang` 哪些属于原系统,后续的版本管理会非常困难,也几乎无法干净卸载,所以这种操作完全是不可逆的,这种方式在系统管理角度是不可取的,既不安全也不便于维护,因此在实际工作中并不推荐使用。 + 官方推荐的做法是单独在 `/usr/local/` 下单独创建一个属于 `clang` 的部署目录,并且标注好版本号,这样也更方便后续的版本管理与维护工作。之后使用: + ```console + $ echo 'export PATH=/usr/local/clang-10.0.0/bin:$PATH' >> ~/.bashrc + $ source ~/.bashrc + ``` + + 这两条命令将当前 `clang-10.0.0` 目录添加到 PATH 环境变量中。 通过这个命令可以看到当前的 PATH 环境变量有哪些目录。 ```console $ echo $PATH - /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + /usr/local/clang-10.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` - 在上面的复制过程中,源目录和目标目录的两个 `bin` 目录会相互合并,`clang` 和 `clang++` 两个可执行文件也就被复制到了 `/usr/local/bin/` 目录中。这样子也就达到了我们希望能够在任意地方调用我们的可执行文件的目的。此外,在复制的时候 lib、doc 等文件夹也会和 `/usr/local` 下的对应目录合并,将 clang 的库和文档加到系统当中。 + 这里我们可以注意到,我们新创建的 `/usr/local/clang-10.0.0` 目录已经添加到了 `PATH` 环境变量中,我们现在就可以像调用 `apt` 等命令一样,在任意地方调用我们下载的二进制编译的程序。 !!! warning "有关手工获取的软件" From 435af020046465fc88e81b00947d5ce67483be5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=BC=A6?= <9313428+zhaowudi@user.noreply.gitee.com> Date: Fri, 28 Nov 2025 16:28:43 +0800 Subject: [PATCH 2/7] style: format markdown with prettier --- docs/Ch03/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index 825505bc..9153ef67 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -474,7 +474,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 $ echo 'export PATH=/usr/local/clang-10.0.0/bin:$PATH' >> ~/.bashrc $ source ~/.bashrc ``` - + 这两条命令将当前 `clang-10.0.0` 目录添加到 PATH 环境变量中。 通过这个命令可以看到当前的 PATH 环境变量有哪些目录。 From ee88941a8d92e5ae1a7916e82c9614a271d09edc Mon Sep 17 00:00:00 2001 From: zhaoge <85532106+zhaogewudi666@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:41:10 +0800 Subject: [PATCH 3/7] Update docs/Ch03/index.md Co-authored-by: taoky --- docs/Ch03/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index 9153ef67..b3b53c16 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -467,7 +467,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 在这里我们需要知道什么是 `PATH` 变量,当我们在终端输入命令时,终端会先判断是否为终端的内建命令,如果不是,则会在 `$PATH` 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 `$PATH` 中的目录下面,我们就可以像 `apt` 一样,在任意地方调用我们的程序。 那为什么是不直接将 `clang` 目录下的内容直接复制到 `/usr/local` 下呢?这么做虽然能让 `clang/bin` 目录下的二进制文件与 `/usr/local/bin/` 合并,从而实现“到处可调用”,但同时也会把解压的 `clang` 目录下的 `lib`、`include`、`share` 等目录混入系统已有的 `/usr/local/lib`、`/usr/local/include` 等目录中。 - 这种方法虽然是最简单最省事的,但是这种方法却忽略了 `linux` 系统最重要的系统管理问题,这种直接将外部编译的 `clang` 的二进制文件和依赖库文件加入到系统的执行目录和依赖中,针对于软件的版本管理和后续的维护卸载几乎成为了不可能,你会根本无法区分哪些文件属于外部编译的 `clang` 哪些属于原系统,后续的版本管理会非常困难,也几乎无法干净卸载,所以这种操作完全是不可逆的,这种方式在系统管理角度是不可取的,既不安全也不便于维护,因此在实际工作中并不推荐使用。 + 这种方法虽然是简单省事的,但由于 clang 有很多版本,并且 clang 软件规模较大、较复杂,有很多文件,这么做会带来麻烦:之前安装的 clang 无法进行有效的版本管理,后续卸载也很困难,因此对复杂软件,并不推荐直接安装到 `/usr/local`。 官方推荐的做法是单独在 `/usr/local/` 下单独创建一个属于 `clang` 的部署目录,并且标注好版本号,这样也更方便后续的版本管理与维护工作。之后使用: ```console From 1a9b33fdd92915db98ccfc6713abc5082066518c Mon Sep 17 00:00:00 2001 From: zhaoge <85532106+zhaogewudi666@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:46:16 +0800 Subject: [PATCH 4/7] Update docs/Ch03/index.md Co-authored-by: taoky --- docs/Ch03/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index b3b53c16..6efea693 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -457,7 +457,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 命令那样在任何地方都可以直接运行。我们可以这样做: ```console - $ # 在 /usr/loacl/ 目录下新建 clang-10.0.0 目录。 + $ # 在 /usr/local/ 目录下新建 clang-10.0.0 目录。 $ sudo mkdir /usr/local/clang-10.0.0 $ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 整个目录复制到新建的 /usr/local/clang-10.0.0 下。 $ sudo cp -R * /usr/local/clang-10.0.0 From 950db5fb1759e92f4a8fe50ba64ad46e1384852e Mon Sep 17 00:00:00 2001 From: zhaoge <85532106+zhaogewudi666@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:47:28 +0800 Subject: [PATCH 5/7] Update docs/Ch03/index.md Co-authored-by: taoky --- docs/Ch03/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index 6efea693..84b73b5f 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -483,7 +483,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 /usr/local/clang-10.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` - 这里我们可以注意到,我们新创建的 `/usr/local/clang-10.0.0` 目录已经添加到了 `PATH` 环境变量中,我们现在就可以像调用 `apt` 等命令一样,在任意地方调用我们下载的二进制编译的程序。 + 这里我们可以注意到,我们新创建的 `/usr/local/clang-10.0.0` 目录已经添加到了 `PATH` 环境变量中,我们现在就可以像调用 `apt` 等命令一样,在任意地方调用我们下载的二进制编译的程序。 !!! warning "有关手工获取的软件" From a65915918e2f44118528edad711bf3d0e16f9741 Mon Sep 17 00:00:00 2001 From: zhaoge <85532106+zhaogewudi666@users.noreply.github.com> Date: Sat, 29 Nov 2025 20:25:16 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E9=92=88=E5=AF=B9=E6=8F=90=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9=E6=84=8F=E8=A7=81=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E7=9A=84=20pr=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 针对之前提交的 pr 对修改内容进行了格式编辑已经 llvm 的版本升级,并修改了关于 apt 的啰嗦内容 --- docs/Ch03/index.md | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index 84b73b5f..e896848c 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -423,13 +423,13 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 ```console $ # 下载二进制的压缩文件存档 - $ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz + $ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.0/clang+llvm-16.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz $ # 创建 clang 目录 $ mkdir clang $ # 将下载得到的压缩文件解压到当前目录 - $ tar xf clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz -C clang + $ tar xf clang+llvm-16.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz -C clang $ cd clang ``` @@ -454,36 +454,30 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 (Output omitted) ``` - 这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 命令那样在任何地方都可以直接运行。我们可以这样做: + 这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 命令下载的程序那样在任何地方都可以直接运行。我们可以这样做: ```console - $ # 在 /usr/local/ 目录下新建 clang-10.0.0 目录。 - $ sudo mkdir /usr/local/clang-10.0.0 - $ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 整个目录复制到新建的 /usr/local/clang-10.0.0 下。 - $ sudo cp -R * /usr/local/clang-10.0.0 - $ echo 'export PATH=/usr/local/clang-10.0.0/bin:$PATH' >> ~/.bashrc - $ source ~/.bashrc + $ # 在 /usr/local/ 目录下新建 clang-16.0.0 目录。 + $ sudo mkdir /usr/local/clang-16.0.0 + $ # 将 clang+llvm-16.0.0-x86_64-linux-gnu-ubuntu-18.04 整个目录复制到新建的 /usr/local/clang-16.0.0 下。 + $ sudo cp -R * /usr/local/clang-16.0.0 ``` - 在这里我们需要知道什么是 `PATH` 变量,当我们在终端输入命令时,终端会先判断是否为终端的内建命令,如果不是,则会在 `$PATH` 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 `$PATH` 中的目录下面,我们就可以像 `apt` 一样,在任意地方调用我们的程序。 - 那为什么是不直接将 `clang` 目录下的内容直接复制到 `/usr/local` 下呢?这么做虽然能让 `clang/bin` 目录下的二进制文件与 `/usr/local/bin/` 合并,从而实现“到处可调用”,但同时也会把解压的 `clang` 目录下的 `lib`、`include`、`share` 等目录混入系统已有的 `/usr/local/lib`、`/usr/local/include` 等目录中。 - 这种方法虽然是简单省事的,但由于 clang 有很多版本,并且 clang 软件规模较大、较复杂,有很多文件,这么做会带来麻烦:之前安装的 clang 无法进行有效的版本管理,后续卸载也很困难,因此对复杂软件,并不推荐直接安装到 `/usr/local`。 - 官方推荐的做法是单独在 `/usr/local/` 下单独创建一个属于 `clang` 的部署目录,并且标注好版本号,这样也更方便后续的版本管理与维护工作。之后使用: + 在这里我们需要知道什么是 `PATH` 变量,当我们在终端输入命令时,终端会优先判断是否为终端的内建命令,如果不是,则会在 `$PATH` 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 `$PATH` 中的目录下面,我们就可以在任意地方调用我们的程序。那为什么是不直接将 `clang` 目录下的内容直接复制到 `/usr/local` 下呢?这么做虽然能让 `clang/bin` 目录下的二进制文件与 `/usr/local/bin/` 合并,从而实现“到处可调用”,但同时也会把解压的 `clang` 目录下的 `lib`、`include`、`share` 等目录混入系统已有的 `/usr/local/lib`、`/usr/local/include` 等目录中。这种方法针对那些只有单一的二进制编译执行程序来说是简单省事的,但由于 `clang` 有很多版本,并且 `clang` 软件规模较大、较复杂,有很多文件,这么做会带来麻烦:安装的 `clang` 无法进行有效的版本管理,后续卸载也很困难,因此像 `clang` 这样的复杂软件,并不推荐直接安装到 `/usr/local`。更推荐的做法是单独在 `/usr/local/` 下单独创建一个属于 `clang` 的部署目录,并且标注好版本号,这样也更方便后续的版本管理与维护工作: ```console - $ echo 'export PATH=/usr/local/clang-10.0.0/bin:$PATH' >> ~/.bashrc + $ echo 'export PATH=/usr/local/clang-16.0.0/bin:$PATH' >> ~/.bashrc $ source ~/.bashrc ``` - 这两条命令将当前 `clang-10.0.0` 目录添加到 PATH 环境变量中。 - 通过这个命令可以看到当前的 PATH 环境变量有哪些目录。 + 这两条命令将当前 `clang-16.0.0` 目录添加到 PATH 环境变量中。通过这个命令可以看到当前的 PATH 环境变量有哪些目录。 ```console $ echo $PATH - /usr/local/clang-10.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + /usr/local/clang-16.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` - 这里我们可以注意到,我们新创建的 `/usr/local/clang-10.0.0` 目录已经添加到了 `PATH` 环境变量中,我们现在就可以像调用 `apt` 等命令一样,在任意地方调用我们下载的二进制编译的程序。 + 这里我们可以注意到,新创建的 `/usr/local/clang-16.0.0` 目录已经添加到了 `PATH` 环境变量中,现在就可以在任意地方调用我们下载的二进制编译的程序。 !!! warning "有关手工获取的软件" From 5ae83221cecb69fe889633fa917e52085b3e6cc6 Mon Sep 17 00:00:00 2001 From: taoky Date: Mon, 1 Dec 2025 03:32:11 +0800 Subject: [PATCH 7/7] minor fix --- docs/Ch03/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Ch03/index.md b/docs/Ch03/index.md index e896848c..0f2ec38b 100644 --- a/docs/Ch03/index.md +++ b/docs/Ch03/index.md @@ -419,7 +419,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以 注:使用 LLVM 需要其前端 Clang。Clang 在 apt 上有提供,使用 `apt install clang` (或对应版本的 clang 包名)命令安装即可。 - 在 LLVM 的 [Prebuilt 下载页面](https://releases.llvm.org/download.html) 中下载需要的版本以及自己的发行版所对应的二进制文件(Pre-Built Binaries)。在 “LLVM 10.0.0” 栏目下找到 “Pre-Built Binaries:”,对于 Ubuntu 和 Xubuntu 只有 Ubuntu 18.04 的预编译二进制文件。 + 在 LLVM 的 [Prebuilt 下载页面](https://releases.llvm.org/download.html) 中下载需要的版本以及自己的发行版所对应的二进制文件(Pre-Built Binaries)。在 “LLVM 16.0.0” 栏目下跳转到对应的 GitHub Release 页面,可以获取到最低兼容 Ubuntu 18.04 的预编译二进制文件。 ```console $ # 下载二进制的压缩文件存档