如何使用 CMake 传递编译器标志以使用 GTest

How to pass compiler flags with CMake to use GTest

我需要帮助设置 gtest 以在编译时添加额外的标志。目前,我收到此警告:

warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11

我的 CMakeLists 文件如下所示:

cmake_minimum_required(VERSION 2.6) 

find_package(GTest REQUIRED)

include_directories(${GTEST_INCLUDE_DIRS})

add_executable(runTests tests.cpp)

target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)\

它是使用本教程创建的:

我应该在哪里添加 -std=c++11 标志来满足这个警告?

您可以通过几种方式解决此问题。旁注,您实际上使用的是 2.6 版的 CMake 吗?还是您的环境需要使用它来实现向后兼容性?

第一个选项:

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

或者,如果您的编译器不支持,您可以使用 -std=c++0x

此外,您可以使用以下代码来检查您的编译器是否支持其中一种:

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)

这会输出一个布尔值到你的 COMPILER_SUPPORTS_CXX11 变量,然后你可以进一步测试它并相应地设置你的标志。

第二个选项是使用 CMAKE_CXX_STANDARD 变量,as described in documentation. This can be also used as separate property on targets (following this doc):

set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

显式设置功能:

target_compile_features(runTests PUBLIC cxx_range_for)

或激活特定标准(自 CMake 版本 3.8.2 以来的 afaik):

target_compile_features(runTests PUBLIC cxx_std_11)

可以找到完整的功能列表 here