我将 clangd 与 VSCode 一起使用。 Clangd 提供了添加缺失包含的可能性。这样做时,它(有时?无法弄清楚何时)会自动将相对或绝对路径添加到 include 指令。
后者在不同操作系统(在我的例子中是 Linux 和 Termux(在我的手机上))上编译时会导致问题,因为绝对(系统)路径明显不同。
例如,而不是
#include "Header.h"
它会添加
#include "/home/user/path/to/the/Header.h"
我当然可以手动删除路径,但我想知道:
有人知道是否有可能禁用此行为并使其忽略路径? 我尝试用谷歌搜索,但不幸的是我找不到任何东西......
提前致谢
编辑:最小示例
结构:
./
- .clangd
- compile_commands.json
- bin/
- build/
- include/
--- Header.h
--- Subheader.h
- src/
--- main.cpp`
内容:
// .clangd
Diagnostics:
UnusedIncludes: Strict
MissingIncludes: Strict
// Subheader.h
#ifndef IG20240815185417
#define IG20240815185417
struct Subheader {
int i{2};
};
#endif
// Header.h
#ifndef IG20240520170135
#define IG20240520170135
#include "Subheader.h"
struct Header {
Subheader sh{};
};
#endif
// main.cpp
#include "Header.h"
int main() {
Header h{};
Subheader sh{};
return 0;
}
编译命令(使用
compile_commands.json
创建):
clang++ -o build/main.o -c src/main.cpp -MJ build/main.o.json -I./include && clang++ -o bin/main.exe build/main.o && sed -e '1s/^/[\n/' -e '$s/,$/\n]/' build/*.o.json > compile_commands.json
请注意,
compile_commands.json
将通过编译命令创建。如果它在您的机器上不起作用,这里是基本编译命令和 .json
文件的最终内容。您必须调整目录以匹配您的系统!
编译命令(不创建
compile_commands.json
):
clang++ -o build/main.o -c src/main.cpp -I./include && clang++ -o bin/main.exe build/main.o
// compile_commands.json
[
{ "directory": "/ABSOLUTE/PATH/TO/WORKING/DIRECTORY", "file": "src/main.cpp", "output": "build/main.o", "arguments": ["/usr/bin/clang++", "-xc++", "src/main.cpp", "-o", "build/main.o", "--driver-mode=g++", "-c", "-I", "./include", "--target=x86_64-pc-linux-gnu"]}
]
观察:
查看
main.cpp
(在 VSCode 中)时,它会在 Subheader
下面显示一条蓝色波浪线,暗示相应的标头丢失/未直接包含(但通过 Header.h
得知)。
当选择 QuickFix 选项时,它会添加包含指令,如下所示:
#include "/path/to/working/directory/include/Subheader.h"