CMake/Make - 不被识别的命令行选项"-std=c++14" - 但是 G++ 可以

3
我今天在服务器上的家目录中编译了gcccmake(按此顺序),因为服务器上的编译器已经有5年历史,我需要使用C++14特性。当我通过命令编译时没有任何问题。请注意,保留HTML标记。
g++ -std=c++14 main.cc

但是如果我使用cmake .然后make,我会得到以下错误:

cc1plus: error: unrecognized command line option "-std=c++14"

在CMakeLists.txt文件中:
add_definitions(-std=c++14)

在CMakeFiles/a.out.dir/flags.make中。
CXX_FLAGS = -I/home/jager/manufacture/usr/local/include -std=c++14

有关信息:

$ g++ --version
g++ (GCC) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cmake --version
cmake version 3.3.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

我不知道这是什么鬼...


看起来cmake正在使用系统的gcc;你应该在CMakeLists.txt中以某种方式设置你的PATH;请参见http://www.cmake.org/Wiki/CMake_Useful_Variables。 - Massa
兄弟,你说得对!把这个加到一个回答里面,我会补充上我做了什么以及人们如何查看CMake使用的编译器... - The Unholy Metal Machine
@Massa 现在还有时间领取您的积分! - The Unholy Metal Machine
我的评论只是暂时的,我是用手机发表的。我认为你扩展了它并提供了自己更完整和正确的答案,所以,请继续发挥!:D - Massa
2个回答

5

看起来您正在使用系统编译器而不是您刚构建的编译器。最好的方法是使用您新编译的g++配置您的项目:

cmake -DCMAKE_CXX_COMPILER=/path/to/your/g++ .

您可以通过进行详细构建并查看CMake使用的g++路径来验证是否使用了正确的编译器:

make VERBOSE=1

你最好的选择是使用新编译的g++来配置你的项目。对我来说,最好的方法是通过设置一些环境变量来为所有项目进行配置。但是你的答案也很好,至少值得一分。 - The Unholy Metal Machine
1
这样做实际上更好:当您分发代码时,用户不需要将编译器设置在与您相同的路径中。此外,该值将存储在您的 CMakeCache.txt 中,因此您只需设置一次即可。一旦关闭终端窗口,您的环境变量将被清除。 - alexgolec
1
如果您像我一样设置变量,就不必重新定义它们......而且我不知道为什么其他人应该将编译器放在同一个位置。正如您所说,如果通过命令行定义变量,则在注销后,使用的编译器将是安装在系统上的编译器......或者有些事情我没有理解。 - The Unholy Metal Machine

5

Massa 评论:

看起来 cmake 正在使用系统的 gcc;你应该在 CMakeLists.txt 中以某种方式添加你的 PATH;

这实际上是正确的,这个问题可以通过在 .bashrc 中添加解决:

CC=/home/BestPathEver/usr/local/bin/gcc
export CC

CXX=/home/BestPathEver/usr/local/bin/g++
export CXX

然后,更新您当前的会话:

$ source ~/.bashrc

在这一点上, CMake将使用好的编译器,而无需您修改项目中的任何文件.

我还建议在一些CMakeLists.txt中添加:

message(STATUS "CMAKE_SYSTEM_NAME          = ${CMAKE_SYSTEM_NAME}"         )
message(STATUS "CMAKE_CXX_COMPILER_ID      = ${CMAKE_CXX_COMPILER_ID}"     )
message(STATUS "CMAKE_CXX_COMPILER_VERSION = ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "CMAKE_COMPILER_IS_GNUCXX   = ${CMAKE_COMPILER_IS_GNUCXX}"  )

当您执行这些命令时,它们将返回一些有用的信息:

$ cmake .

1
我看到你提交了你自己的答案。如果这个回答解决了你的问题,请接受它,这样它就会出现在列表的顶部。 - alexgolec
1
@Alex,实际上我期望Massa回答……因为正是他的评论帮助我解决了那个问题。如果他不回答,我会在几个小时内接受我的答案。 - The Unholy Metal Machine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接