问题描述
我有两个从同一个源(一个客户端和一个服务器)构建的可执行文件,它们使用编译选项 -D CLIENT=0 -D SERVER=1
用于服务器,-D CLIENT=1 -D SERVER=0
用于客户端。如果我做类似的事情
if (CLIENT) {
// Client specific code
}
clangd 抱怨没有定义 CLIENT。有没有办法让 clangd 知道这些宏? (代码编译得很好,错误来自clangd
,而不是编译器)
解决方法
有没有办法让 clangd 知道这些宏?
来自getting started with clangd:
项目设置
要了解项目中的源代码,clangd 需要知道 建立标志。 (这只是 C++ 中的一个事实,源文件不是 自包含。)
默认情况下,clangd 会假设源代码构建为 clang some_file.cc,你可能会得到关于丢失的虚假错误 #included 文件等。有几种方法可以解决这个问题。
compile_commands.json
compile_commands.json 文件提供了所有源码的编译命令 项目中的文件。该文件通常由构建生成 系统或与构建系统集成的工具。 Clangd 会看 对于您编辑的文件的父目录中的此文件。其他 工具也可以生成这个文件。查看 compile_commands.json 规范。
compile_commands.json
通常由 CMake 构建系统生成,但更多构建系统会尝试生成它。
我建议将您的项目转移到 CMake,在此过程中您将学习这个工具,它肯定会帮助您进行进一步的 C-ish 开发。
compile_flags.txt
如果一个项目中的所有文件都使用相同的构建标志,你可以把它们放在 标志,每行一个标志,位于源根目录的 compile_flags.txt 中。
Clangd 会假设编译命令是 clang $FLAGS some_file.cc。
手动创建此文件是一个合理的起点,如果您 项目很简单。
如果不转向 cmake,请创建一个 compile_flags.txt
文件,内容如下,clangd
应该选择此文件:
-DCLIENT=1
-DSERVER=1