使用SDL 2.0和C++11的CMake

5

我在使用CMake编译C++11/SDL 2.0代码时遇到了一些问题。CMakeLists非常简单:

cmake_minimum_required(VERSION 2.6)
project(Test)

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
include_directories(${SDL2_INCLUDE_DIRS})
target_link_libraries(sdl2test ${SDL2_LIBRARIES})

add_definitions(-std=c++0x)
add_executable(Test src/main.cpp)

然而,当编译时,我收到了这个错误:
Scanning dependencies of target Test
[100%] Building CXX object CMakeFiles/Test.dir/src/main.cpp.o
/var/dev/cmake/src/main.cpp: In function ‘int main(int, char**)’:
/var/dev/cmake/src/main.cpp:11:16: error: ‘nullptr’ was not declared in this scope
/var/dev/cmake/src/main.cpp:17:16: error: ‘nullptr’ was not declared in this scope
make[2]: *** [CMakeFiles/Test.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Test.dir/all] Error 2
make: *** [all] Error 2

我使用的是cmake version 2.8.9和gcc 4.7.2。有没有什么好的方法可以在CMake中正确地使用C++11特性?

附:我已经尝试过-std=c++11了。


请问您能否添加 make VERBOSE=1 的输出结果。我猜测定义没有被添加。 实际上,-st=c++11 不是一个标志,而是编译器的一部分。对我来说,set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ") 可以工作。 - usr1234567
1个回答

6

add_definitions 实际上是为了设置预处理器定义。您需要在此处设置 CMAKE_CXX_FLAGS

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

你删除了 add_definitions 的调用,是吗?能否运行 make VERBOSE=1 并粘贴输出内容? - Fraser
1
你能否尝试在一个干净的构建文件夹中从头开始吗?set命令肯定是正确的;我经常使用它。 - Fraser
1
我刚刚检查了一下,你原来的 add_definitions(-std=c++0x) 实际上也可以工作,尽管它不是一个预处理器定义。 - Fraser
1
您可以使用此最小示例检查是否传递了标志。只需将CMakeLists.txt复制到文件夹中,cd到该文件夹,然后运行这些命令即可。 - Fraser
可能是这样,但我在你的示例CMakeLists.txt中没有看到任何会导致CXX标志值被重置/更改的内容。pkg_search_module应该只设置像SDL2_CFLAGS这样的变量,而不应该触及CMAKE_CXX_FLAGS。可能最好的调试方法是在CMakeLists.txt的早期设置CMAKE_CXX_FLAGS,然后立即在其后面放置variable_watch(CMAKE_CXX_FLAGS) - Fraser

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