22.4 C/C++ 环境的配置
概述
FreeBSD 基本系统内置 Clang 编译器,但并不包含 LLVM 中的其他组件,如 clangd(语言服务器,用于代码补全、编译错误提示和定义跳转等)、Clang-Tidy(代码风格诊断器)以及 clang-format(用于格式化 C/C++ 代码)。
因此需要安装 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下文使用 LLVM 20,安装后对应的程序名为 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 是一款基于 Node.js 的智能补全插件,适用于 Vim 和 Neovim,支持完整的 LSP(Language Server Protocol,语言服务协议)。其配置方式和插件系统整体风格类似 VSCode。clangd 用于为 C/C++ 提供 LSP 支持。
使用 pkg 安装 coc.nvim 依赖
或者使用 ports 安装:
其中 node 作为依赖会自动安装。
在 ~/.vimrc 中写入
进入 vim,输入以下命令,使用 vim-plug 安装配置的所有插件:
插件安装完成,仍继续在 vim 中,安装 json clangd cmake 补全插件:
配置 clangd 补全:在 vim 中使用 Coc.nvim 安装 JSON、Clang 和 CMake 支持插件。
打开配置文件后,输入并保存(你也可以手动编辑 ~/.vim/coc-settings.json 写入):
此时已经可以通过 Coc.nvim 使用代码补全功能。
对简单的小程序,在源文件目录下新建 compile_flags.txt 文件,输入:
如此可在 coc 中对 /usr/local/include 下的头文件进行补全(指定编译器搜索头文件的路径为 /usr/local/include)。
对于复杂项目,应使用 compile_commands.json 文件来配置补全。clangd 会在文件所在目录的父目录及名为 build/ 的子目录中查找。例如,正在编辑 $SRC/gui/window.cpp 时,clangd 会依次查找 $SRC/gui/、$SRC/gui/build/、$SRC/、$SRC/build/ 等目录。
以基于 CMake 的项目为例,在项目文件夹下
项目结构如下所示

或者在 CMakeLists.txt 中
可自动生成 compile_commands.json 文件,有了这个文件再编辑源文件时就可以使用补全功能了。
CMake 默认使用系统自带的 Clang 编译器,可以通过以下方式指定使用 clang20:
再执行 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-plug 安装配置的所有 Google 插件
此时可以在退出插入模式后自动格式化代码,也可以在 Vim 中手动执行 :FormatCode 命令进行格式化。
vim-clang-format 代码美化
clang-format 代码美化需安装插件 vim-clang-format。
在 ~/.vimrc 中加入以下行,以安装 vim-clang-format 插件,用于自动格式化代码。
并在 ~/.vimrc 中设置
保存 ~/.vimrc 后,使用 vim-plug 安装 vim-clang-format 插件
安装插件后可以使用,如:

退出插入模式

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 语言算法与数据结构编程实例。
最后更新于
这有帮助吗?