我知道您可以使用此处描述的 GXX_EXPERIMENTAL hack 启用正确的语法突出显示: Eclipse CDT indexer does not know C++11 containers
但我认为,在使用 cmake 生成项目时,根本不需要触摸项目设置。
所以。有没有更简单的解决方案?
我知道您可以使用此处描述的 GXX_EXPERIMENTAL hack 启用正确的语法突出显示: Eclipse CDT indexer does not know C++11 containers
但我认为,在使用 cmake 生成项目时,根本不需要触摸项目设置。
所以。有没有更简单的解决方案?
答案很简单。
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 很重要!
而已。该项目将使用正确的符号生成。索引器、语法突出显示和自动完成功能应按预期工作,而无需手动更改任何项目设置。
如前所述,项目生成器的调用在解析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
...
在 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<>。
一些文档链接: