【问题标题】:CMake with SDL 2.0 and C++11使用 SDL 2.0 和 C++11 的 CMake
【发布时间】:2013-10-02 22:28:38
【问题描述】:

我在使用 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 版本 2.8.9 和 gcc 4.7.2。关于如何通过 CMake 正确使用 C++11 功能的任何想法?

ps:我也试过-std=c++11

【问题讨论】:

  • 能否请您添加make VERBOSE=1 的输出。我想没有添加定义。实际上, -st=c++11 不是标志,而是编译器的一部分。对我来说set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ") 有效。

标签: c++ c++11 cmake


【解决方案1】:

add_definitions 真正用于设置预处理器定义。您需要在此处设置CMAKE_CXX_FLAGS

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

【讨论】:

  • 您删除了我假设的add_definitions 电话?你能运行make VERBOSE=1 并粘贴输出吗?
  • 您可以在干净的构建文件夹中从头开始尝试吗? set 命令绝对正确;我经常用这个。
  • 我刚刚检查过,您原来的 add_definitions(-std=c++0x) 实际上也应该可以工作,即使它不是预处理器定义。
  • 您可以使用this minimal example检查标志是否通过。只需将 CMakeLists.txt 复制到一个文件夹,cd 到该文件夹​​,然后运行 ​​these commands
  • 可能,但我在您的示例 CMakeLists.txt 中看不到任何会导致 CXX 标志的值被重置/更改的内容。 pkg_search_module 应该只设置像SDL2_CFLAGS 这样的变量并且不应该触及CMAKE_CXX_FLAGS。可能在 CMakeLists.txt 的早期设置 CMAKE_CXX_FLAGS,然后在放置 variable_watch(CMAKE_CXX_FLAGS) 之后立即设置是最好的调试方法。
猜你喜欢
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2021-05-21
  • 2014-08-15
相关资源
最近更新 更多