【问题标题】:Why C++98 is used when specified -std=gnu++11? [duplicate]为什么指定-std=gnu++11时使用C++98? [复制]
【发布时间】:2014-05-26 13:58:50
【问题描述】:

我正在尝试编译一个应用程序,并在CMakeLists.txt 中添加了这些行

option(DISPLAY "Display images and steps" OFF)
option(TESTS "Build tests too" OFF)

if (DISPLAY)
set(CMAKE_CXX_FLAGS "-g -Wall -std=gnu++11 -DDISPLAY_IMGS")
else()
set(CMAKE_CXX_FLAGS "-g -Wall -std=gnu++11")
endif()

(这些行在文件的开头)我收到这样的错误:

In function ‘int main(int, char**)’:
error: in C++98 ‘featuresTypes’ must be initialized by constructor, not by ‘{...}’

谁能告诉我为什么这样做?事实上,在 KDevelop 中构建它可以正常工作,但是在终端中构建它($ cmake ..$ make),它会给出错误。


VERBOSE=1 说:

/usr/bin/cmake -H/home/xxx/proj/prj1 -B/home/xxx/proj/prj1/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/xxx/proj/prj1/build/CMakeFiles /home/xxx/proj/prj1/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/xxx/proj/prj1/build'
make -f CMakeFiles/prj1.dir/build.make CMakeFiles/prj1.dir/depend
make[2]: Entering directory `/home/xxx/proj/prj1/build'
cd /home/xxx/proj/prj1/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/xxx/proj/prj1 /home/xxx/proj/prj1 /home/xxx/proj/prj1/build /home/xxx/proj/prj1/build /home/xxx/proj/prj1/build/CMakeFiles/prj1.dir/DependInfo.cmake --color=
Dependee "/home/xxx/proj/prj1/build/CMakeFiles/optimisation.dir/DependInfo.cmake" is newer than depender "/home/xxx/proj/prj1/build/CMakeFiles/prj1.dir/depend.internal".
Dependee "/home/xxx/proj/prj1/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/xxx/proj/prj1/build/CMakeFiles/prj1.dir/depend.internal".
Scanning dependencies of target optimisation
make[2]: Leaving directory `/home/xxx/proj/prj1/build'
make -f CMakeFiles/optimisation.dir/build.make CMakeFiles/prj1.dir/build
make[2]: Entering directory `/home/xxx/proj/prj1/build'
/usr/bin/cmake -E cmake_progress_report /home/xxx/proj/prj1/build/CMakeFiles 1
[ 12%] Building CXX object CMakeFiles/prj1.dir/src/cpp/main.cpp.o
/usr/bin/c++    -I/usr/local/include/opencv -I/usr/local/include -I/home/xxx/proj/prj1/src/hpp    -o CMakeFiles/prj1.dir/src/cpp/main.cpp.o -c /home/xxx/proj/prj1/src/cpp/main.cpp
/home/xxx/proj/prj1/src/cpp/main.cpp: In function ‘int main(int, char**)’:
/home/xxx/proj/prj1/src/cpp/main.cpp:99:33: error: in C++98 ‘featuresTypes’ must be initialized by constructor, not by ‘{...}’

它应该怎么做?

【问题讨论】:

  • make VERBOSE=1 看看到底做了什么?
  • 我敢打赌 -std 选项在命令行输出中被覆盖。照马克说的做。
  • 我添加了VERBOSE的信息,我怎么知道它被覆盖了?
  • 你在输出中没有找到 -std=c+11... 可能是stackoverflow.com/q/10085945的重复
  • 标题完全具有误导性。你实际上并没有使用那个标志。

标签: c++ cmake flags


【解决方案1】:

您的标志根本没有进入构建命令。因此,您要么尝试在 CMakeLists.txt 中的 project 行之前设置这些标志,要么在之后包含一些覆盖它们的东西。

您可能应该将它们移动到任何 project 行和包含之后,并将它们附加到当前值,因为最后一个标志获胜。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -std=gnu++11")
if (DISPLAY)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDISPLAY_IMGS")
endif()

【讨论】:

  • 是的,它们应该在project 之后...现在似乎可以工作了。事实上,添加TESTS 选项后,问题就出现了。如果你把flags放在project之前,我认为这是某种undefined behaviour
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多