1

我有两个从同一源(客户端和服务器)构建的可执行文件,它们是使用-D CLIENT=0 -D SERVER=1服务器和-D CLIENT=1 -D SERVER=0客户端的编译选项构建的。如果我做类似的事情

if (CLIENT) {
// Client specific code
}

clangd 抱怨 CLIENT 没有定义。有没有办法让 clangd 知道这些宏?(代码编译得很好,错误来自clangd,而不是编译器)

4

1 回答 1

0

有没有办法让 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
于 2021-06-08T13:22:11.687 回答