代码使用cmake干净地构建,当作为外部项目添加时失败
code builds cleanly with cmake, fails when added as an external project
问题摘要
我有一个使用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()
相关文章:
- 使外部项目可用于find_package CMake
- 链接导入的库与CMAKE外部项目
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 如何获取外部项目定义的目标的输出路径?
- cmake:add_depentencies不适用于外部项目
- cmake-包括外部项目的目录
- CMake:重建外部项目
- 如何为 CMAKE 外部项目指定编译器
- 如何将正确的库与 GLFW 链接为 cmake 中的外部项目
- CMAKE:外部项目更新和离线工作
- CMake:包含外部项目的错误
- 如何将 CMake 参数转发到外部项目
- CMake:GLFW作为外部项目
- 使用 cmake 将依赖项传播到仅标头的外部项目
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 代码使用cmake干净地构建,当作为外部项目添加时失败
- 将cmake构建选项导出到外部项目
- 添加预处理器定义到cmake外部项目
- 为外部项目设置RPATH
- 通过cmake链接openv库作为外部项目