14

我知道您可以使用此处描述的 GXX_EXPERIMENTAL hack 启用正确的语法突出显示: Eclipse CDT indexer does not know C++11 containers

但我认为,在使用 cmake 生成项目时,根本不需要触摸项目设置。

所以。有没有更简单的解决方案?

4

3 回答 3

23

答案很简单。

eclipse cdt 生成器在解析符号时会忽略使用 add_definitions(...) 添加的定义。相反,它使用 CMAKE_CXX_COMPILER_ARG1。所以你所要做的就是:在调用 cmake 时添加 -DCMAKE_CXX_COMPILER_ARG1=-std=c++11

从命令行生成项目文件:

cmake ../../src -G"Eclipse CDT4 - MinGW Makefiles" -DCMAKE_ECLIPSE_VERSION=4.2 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_ARG1=-std=c++11

从 cmake gui 生成项目:

- Select source and build directory.
- now BEFORE hitting configure or generate. Press "Add Entry" and add a new entry. Name:CMAKE_CXX_COMPILER_ARG1 Type:STRING Value:-std=c++11
- press Generate and create the Eclipse project

在第一次点击配置或生成之前预先设置 CMAKE_CXX_COMPILER_ARG1 很重要!

而已。该项目将使用正确的符号生成。索引器、语法突出显示和自动完成功能应按预期工作,而无需手动更改任何项目设置。

于 2013-08-21T13:10:38.393 回答
4

如前所述,项目生成器的调用解析CMakeLists.txt. 因此,其中的任何定义CMakeLists.txt都不会对生成的项目文件产生任何影响。

在 eclipse-project 生成的情况下,在CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake中请求编译器的功能。在第23CMAKE_CXX_FLAGS行,解析变量,在第30行计算。特别是这个 CMAKE_CXX_FLAGS变量只能在cmake从命令行调用时设置。

推荐正确的 cmake 调用:(cmake -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_CXX_FLAGS="-std=c++11"或替换c++11为例如。c++14或您喜欢的任何其他标准)

提示: 评估第30行的结果可以通过运行以下命令作为示例来查看:touch /tmp/dummy; /usr/bin/c++ -v -E -x c++ -std=c++11 -dD /tmp/dummy. 它从编译器中输出所有定义,这些定义被解析到 eclipse-project 中:

...
#define __STDC__ 1
#define __cplusplus 201103L
...
于 2017-02-16T11:04:41.000 回答
3

在 cmake 3.1 版中,引入了一个新变量 CMAKE_CXX_STANDARD,可以激活 C++11 支持。尝试这样的事情:

cmake ../../src -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_CXX_STANDARD=11

这似乎延续到生成的 Eclipse 项目。我用版本 3.2.0-rc2 进行了尝试,Eclipse 识别了 C++11 特性,如 std::shared_ptr<>。

一些文档链接:

于 2015-03-10T01:32:44.623 回答