我正在开发一个交叉编译的软件项目,其结构大致如下所示。将 Visual Studio Code 与 CMake 和“CMake Tools”扩展一起使用。在这种情况下,创建了两个可执行文件,它们有自己的一组源文件(如
main.c
),但它们有一些共享代码。对于此共享代码,使用了附加配置,包含在名为 libconfig.h
的文件中,这些文件包含在 libapi.h
中。
确保加载正确的配置标头的方法是具有正确的顺序或
-I...
参数,即显式 target_link_directories
对于 CMake 配置中的每个目标,以便它自己的包含文件夹首先出现。
但是使用 VS Code 我遇到了一个问题。似乎基本上不考虑每个目标的包含目录列表,并且 IntelliSense 读取文件系统中任何位置找到的第一个同名文件,并仅将这些内容进行评估。例如,在编辑
comp2/src/main.c
时,忽略 comp2/include/libconfig.h
,而使用 comp1/include/libconfig.h
(当我尝试导航到那里时,也会打开它)。这严重破坏了语法突出显示。我尝试在 CMake 选项卡中选择显式构建目标,但这并不能解决任何问题。我已经清除了用户配置文件文件夹中的缓存数据文件夹,但这也没有效果。
我从其他 IDE 中了解到可以选择目标范围,这实际上会对评估产生影响。 VSCode 是否也可以实现同样的效果?
旁注:我注意到的另一件事是,由于不寻常的编译器,它报告某些标头中某些非标准关键字的解析错误。这可能会对问题产生影响吗?
.
├── CMakeLists.txt
├── Toolchain.cmake
├── comp1
│ ├── include
│ │ └── libconfig.h
│ └── src
│ └── main.c
├── comp2
│ ├── include
│ │ └── libconfig.h
│ └── src
│ └── main.c
└── libX
├── include
│ └── libapi.h
└── src
└── libsrc.c
我发现的最可靠的解决方法是使用 CMAKE_EXPORT_COMPILE_COMMANDS 选项。有了这个(但仅当安装了 CppTools 扩展时),人们可以在 Command Pallete 中键入 IntelliSense,它提供了选择数据源的选项。然后就可以选择相关的
compile_commands.json
文件。设置完成后,通过 Ctrl-Click 进行的导航似乎可以在属于所选构建目标的源中正常工作。