首页 > 解决方案 > 如何摆脱导入的 make 项目中的 Eclipse 索引器“Type std::... could not be resolved”错误

问题描述

重现步骤。

  1. 使用 g++ 默认为早于 c++17 的标准的 Linux 系统,但如果给定 -std 选项则支持 c++17
  2. 使用 main.cpp 在 Eclipse 之外创建简单的 C++ 项目:
#include <filesystem>
int main()
{
    std::filesystem::path p;
    return 0;
}
  1. 和Makefile:
all: a.out
a.out: main.cpp
    g++ --std=c++17 -lstdc++fs main.cpp
  1. 使用 EclipseFile->Import->C/C++->Existing Code as Makefile Project在包含这两个文件的目录上创建项目

项目构建正确,但索引器发现未解决的包含filesystem和类型std::filesystem::path。在更复杂的现实世界案例中,没有未解决的夹杂物,但存在许多未解决的类型。

谷歌发现了很多建议-std=c++17Properties->C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other Flags但是对于导入的 makefile 项目Tool Settings被禁用(我的 Eclipse 版本是 4.14,但我想其他版本也是如此),所以这不是一个可行的方法。

标签: c++linuxeclipsegcc

解决方案


我为项目找到了部分解决方法,您可以对项目中的所有文件使用相同的标志。在Properties->C/C++ General->Preprocessor Include Paths, Marcos etc.->Providers勾号CDT GCC Built-in Compiler Settings。这将能够更改Command to get compiler specs在我的情况下默认看起来像这样的字段内容${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"。将您需要的标志添加到此命令中 --- 例如将其更改为${COMMAND} ${FLAGS} -E -P -v -dD --std=c++17 "${INPUTS}". 之后您可能需要重新启动 Eclipse 和/或手动触发索引重建。

该字段的内容将执行一次,其中 INPUTS 替换为空路径.C一次执行空.c文件。CDT 将解析输出以了解编译器使用的包含和预处理器定义。

如果MakeFile项目需要C ++的不同选项,这似乎仍然可以实现,但是要进行更多的工作(您需要准备一些脚本,这些脚本您将放入此字段,并且此脚本需要根据语言来调用真正的编译器,并具有适当的选项.

似乎不可能告诉索引器不同的文件使用不同的选项。我尝试在导入项目时为索引器选择交叉编译器工具链,然后使用此答案https://stackoverflow.com/a/27180772/31086选择我的“假”工具链,其前缀为空,路径指向带有脚本的目录g++gcc并且as(在真正的编译器下调用并记录正在发生的事情),但索引器不会为每个文件调用编译器,它使用自己的逻辑来解析文件,所以没有乐趣。


推荐阅读