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

时间:2016-11-07 22:03:46

标签: c++ cmake external-project

问题摘要。

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

但是,当我使用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拉取了一个Google项目,但它不会导致任何问题。

涉及的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 ""
)

1 个答案:

答案 0 :(得分:1)

默认 CMAKE_BUILD_TYPE 为空,因此省略所有特定于配置的设置。

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

异常是<{1}}的优化关键字:it works,与任何非调试配置相对应。

良好的做法是为项目提供默认构建类型This post为此目的建议了一个很好的模板:

target_link_libraries