让 clangd 知道编译器给出的宏 compile_commands.jsoncompile_flags.txt

问题描述

我有两个从同一个源(一个客户端和一个服务器)构建的可执行文件,它们使用编译选项 -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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...