0

问题总结。

我有一个使用 CMake 构建的项目 A,它可以干净地编译。

但是,当我使用 CMake 的 ExternalProject_Add 命令将 A 拉入另一个项目 B 时,当它到达构建 A 的点时编译失败。

我得到的那种错误。

编译 B 会出现这样的错误

warning: rvalue references are a C++11 extension [-Wc++11-extensions]

当它开始编译 A(这又是由 ExternalProject_Add 引入的)时。

请注意,-std=c++11在所有涉及的 CMakeList.txt 文件中设置。

请注意,我也在使用 ExternalProject_Add 拉取一个谷歌项目,但它不会导致任何问题。

涉及的 CMakeLists.txt 文件中的一些细节。

以下摘录来自 A 的 CMakeLists.txt:

# Use the C++11 standard.
set (CC_FLAGS "-std=c++11")

# Figure out the warning flags to use.
CHECK_CXX_COMPILER_FLAG("-pedantic-errors" SUPPORTS_PEDANTIC_ERRORS)
CHECK_CXX_COMPILER_FLAG("-Wall" SUPPORTS_WALL)
CHECK_CXX_COMPILER_FLAG("-Wextra" SUPPORTS_WEXTRA)

if (SUPPORTS_PEDANTIC) 
  set (CC_FLAGS "${CC_FLAGS} -pedantic")
endif()

# [omitted]... similarly for the rest of the flags.

set (CMAKE_CXX_FLAGS_RELEASE "-O3 ${CC_FLAGS}")
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CC_FLAGS}")

以下来自 B 的 CMakeLists.txt。不同的部分出现在星号 (*) 之后。

# Use the C++11 standard.
set (CC_FLAGS "-std=c++11")

# Figure out the warning flags to use.
CHECK_CXX_COMPILER_FLAG("-pedantic-errors" SUPPORTS_PEDANTIC_ERRORS)
CHECK_CXX_COMPILER_FLAG("-Wall" SUPPORTS_WALL)
CHECK_CXX_COMPILER_FLAG("-Wextra" SUPPORTS_WEXTRA)

if (SUPPORTS_PEDANTIC) 
  set (CC_FLAGS "${CC_FLAGS} -pedantic")
endif()

# [omitted]... similarly for the rest of the flags.

set (CMAKE_CXX_FLAGS_RELEASE "-O3 ${CC_FLAGS}")
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CC_FLAGS}")

# ************* DIFFERS HERE ************

ExternalProject_Add (
  projectA

  PREFIX "${projectA_prefix}"
  GIT_REPOSITORY "[omitted]"

  INSTALL_COMMAND ""
)

ExternalProject_Add (
   google_benchmark

   PREFIX "${GoogleBenchmarkPrefix}"
   GIT_REPOSITORY "https://github.com/google/benchmark.git"

   UPDATE_COMMAND ""

   BUILD_COMMAND make benchmark
   INSTALL_COMMAND ""
)
4

1 回答 1

1

默认情况下CMAKE_BUILD_TYPE,因此所有特定于配置的设置都被省略。

这就是为什么不CMAKE_CXX_FLAGS_*使用任何变量的原因,因此该项目是在没有c++11.

Exception 是优化的关键字target_link_libraries任何非调试配置相对应。

好的做法是为项目提供默认的构建类型这篇文章为此目的提出了很好的模板:

# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Setting build type to 'Debug' as none was specified.")
  set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
  # Set the possible values of build type for cmake-gui
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
    "MinSizeRel" "RelWithDebInfo")
endif()
于 2016-11-08T08:28:32.213 回答