22.4 C/C++ 环境的配置

概述

FreeBSD 基本系统内置 Clang 编译器,但并不含 llvm 中其它组件,如 clangd(语言服务器,用于代码补全,编译错误,定义跳转等)、Clang-Tidy(代码风格诊断器)clang-format(用于格式化语言代码)。

所以要安装 llvm,这里各版本的 llvm 都可用,不过至少不应比系统自带的 clang 版本低,在 FreeBSD 14.2 中 clang 版本为 18。

  • 查看 clang 版本:

# clang -v
FreeBSD clang version 18.1.6 (https://github.com/llvm/llvm-project.git llvmorg-18.1.6-0-g1118c2e05e67)
Target: x86_64-unknown-freebsd14.2
Thread model: posix
InstalledDir: /usr/bin

下文使用 llvm20,安装后对应的程序名为 clang20、clang++20、clangd20、clang-format20。而基本系统内置的 clang,程序名为 clang。若使用不同版本请注意对照。

安装 Clang 环境包

  • 使用 pkg 安装:

# pkg install llvm20 cmake git
  • 或者使用 Ports 安装:

# cd /usr/ports/devel/llvm20/ && make install clean
# cd /usr/ports/devel/cmake/ && make install clean
# cd /usr/ports/devel/git/ && make install clean

配置 vim

安装 vim 及插件管理器

  • 使用 pkg 安装:

  • 或者使用 Ports 安装:


安装 vim 插件管理器 vim-plug。若使用其它插件管理器,请自行调整:

coc.nvim 添加 clangd 补全

Coc.nvim 是一款基于 NodeJS,适用于 Vim、Neovim 的智能补全插件。拥有完整的 LSP (Language Server Protocol,语言服务协议)支持。配置使用方式及插件系统的整体风格类似 VSCode。clangd 用于支持 c/c++ 的 LSP。

安装 coc.nvim 依赖

或者

其中 node 作为依赖会自动安装。

~/.vimrc 中写入

进入 vim,输入:

插件安装完成,仍继续在 vim 中,安装 json clangd cmake 补全插件:

配置 clangd 补全,在 vim 中:

打开配置文件后,输入并保存(你也可以手动编辑 ~/.vim/coc-settings.json 写入):

此时已经可以使用 coc 进来补全了。


对简单的小程序,在源文件目录下新建 compile_flags.txt 文件,输入:

如此可在 coc 可以用 /usr/local/include 下的头文件可以补全。

对于复杂的项目,使用 compile_commands.json 文件设置补全。clangd 会在你文件的父目录中查找,也会在名为 build/ 的子目录中查找。例如,正在编辑 $SRC/gui/window.cpp, 会查找 $SRC/gui/$SRC/gui/build/$SRC/$SRC/build/

以基于 CMake 的项目为例,在项目文件夹下

项目结构如下所示

或者在 CMakeLists.txt

可自动生成 compile_commands.json 文件,有了这个文件再编辑源文件时就可以使用补全功能了。

cmake 默认使用的是系统自带的 clang,可以用

再执行 cmake 以使用 clang20。

可以在 .xprofile 等文件中写入:

以使得 clang20、clang++20 成为默认,但这应该根据项目要求进行。

此时已生成 compile_commands.json 文件,可以在 vim 中进行补全

注意

以下操作在 sh/bash/zsh 中使用,csh/tcsh 请作相应改动

代码美化

vim-clang-format 多年未更新。因此对新的 clang-format 支持有问题(clang-format15 版本正常,clang-format17 和 clang-format19 不正常),故推荐使用 vim-codefmt。

vim-codefmt 代码美化

~/.vimrc 中加入:

同时在 ~/.vimrc 中设置如下:

  • 第一句 Glaive 语句设置用于设置 clang-format 执行文件路径。

  • 第二句 Glaive 语句设置格式化的风格样式。也可以设为 "file""file:<format_file_path>"。参考 格式

  • 第一句 autocmd 设置在文件为类型是 c/cpp 时启用 vim-codefmt 的 AutoFormatBuffer clang-format。

  • 第二句 autocmd 设置在文件后缀为 .h, .hpp, .c, .cpp 时,退出插入模式后执行 :FormatCode 命令。


保存 ~/.vimrc

现在可以在退出插入模式后自动进行格式化,也可以手动在 vim 中执行 :FormatCode 命令进行格式化

vim-clang-format 代码美化

clang-format 代码美化需安装插件 vim-clang-format,方法如下

~/.vimrc 中加入

并在 ~/.vimrc 中设置

保存 ~/.vimrc

安装插件后可以使用,如:

退出插入模式

asynctasks.vim 构建任务系统

asynctasks.vim 插件 为 Vim 引入类似 vscode 的 tasks 任务系统,用统一的方式系统化解决各类:编译/运行/测试/部署任务。

安装插件

~/.vimrc 中设置

其中 asyncrun_rootmarks 用于指定标记项目根目录的文件/文件夹

asynctasks.vim 在每个项目的根文件夹下面放一个 .tasks 来描述针对该项目的局部任务,同时维护一份 ~/.vim/tasks.ini 的全局任务配置,适配一些通用性很强的项目,避免每个项目重复写 .tasks 配置。

vim 可以用 :AsyncTaskEdit 来编辑本地任务,:AsyncTaskEdit! 来编辑全局任务。

参考:

最后以最简单的 C++ hello world 项目为例

项目文件结构如下:

  • /home/j/project/CMakeLists.txt 文件

  • /home/j/project/src/CMakeLists.txt 文件

  • /home/j/project/src/main.cpp 文件

编译运行

生成程序文件 /home/j/project/build/src/test,运行之

或者在 vim 中 运行 :AsyncTask project-build , :AsyncTask project-run :

资源

  • algcl,一些可直接运行于 FreeBSD 的 C 语言算法与数据结构编程实例。

最后更新于

这有帮助吗?