代码使用cmake干净地构建,当作为外部项目添加时失败

code builds cleanly with cmake, fails when added as an external project

本文关键字:外部 项目 添加 失败 cmake 构建 代码      更新时间:2023-10-16

问题摘要

我有一个使用CMake构建的项目a,它编译得很干净。

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

我犯的那种错误

编译B会出现类似的错误

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

当它开始编译A时(它再次由ExternalProject_Add引入(。

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

请注意,我还使用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 ""
)

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

这就是为什么没有使用CMAKE_CXX_FLAGS_*变量,所以项目是在没有c++11的情况下构建的。

例外是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()