c++ - 如何摆脱导入的 make 项目中的 Eclipse 索引器“Type std::... could not be resolved”错误
问题描述
重现步骤。
- 使用 g++ 默认为早于 c++17 的标准的 Linux 系统,但如果给定 -std 选项则支持 c++17
- 使用 main.cpp 在 Eclipse 之外创建简单的 C++ 项目:
#include <filesystem>
int main()
{
std::filesystem::path p;
return 0;
}
- 和Makefile:
all: a.out
a.out: main.cpp
g++ --std=c++17 -lstdc++fs main.cpp
- 使用 Eclipse
File->Import->C/C++->Existing Code as Makefile Project
在包含这两个文件的目录上创建项目
项目构建正确,但索引器发现未解决的包含filesystem
和类型std::filesystem::path
。在更复杂的现实世界案例中,没有未解决的夹杂物,但存在许多未解决的类型。
谷歌发现了很多建议-std=c++17
,Properties->C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other Flags
但是对于导入的 makefile 项目Tool Settings
被禁用(我的 Eclipse 版本是 4.14,但我想其他版本也是如此),所以这不是一个可行的方法。
解决方案
我为项目找到了部分解决方法,您可以对项目中的所有文件使用相同的标志。在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
(在真正的编译器下调用并记录正在发生的事情),但索引器不会为每个文件调用编译器,它使用自己的逻辑来解析文件,所以没有乐趣。
推荐阅读
- python - Anaconda 提示打开时出错
- python - 为什么我无法在 python 中使用 youtube-dl 下载 mp4 文件
- sql-server - 将所有常规设置分组在一个表中或为每个设置创建表是否正确?
- python - 使用变量来描述数组/列表索引的索引范围/切片
- masm - 汇编程序中是否有特殊符号表示源代码中的换行符?
- c++ - 更改球体的位置而不重新创建它
- image - 是否有任何应用程序可以查看 .scn 格式的医学图像(3D)?
- android-studio-3.0 - 使用:在 android (manifest.xml)
- crdt - 如何在 delta-crdt 中管理和保持 delta-state 的大小最小
- c++ - 使用 max 函数和/或替代方法的正确方法