我有两个从同一源(客户端和服务器)构建的可执行文件,它们是使用-D CLIENT=0 -D SERVER=1
服务器和-D CLIENT=1 -D SERVER=0
客户端的编译选项构建的。如果我做类似的事情
if (CLIENT) {
// Client specific code
}
clangd 抱怨 CLIENT 没有定义。有没有办法让 clangd 知道这些宏?(代码编译得很好,错误来自clangd
,而不是编译器)
有没有办法让 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