代码使用 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 引入)。
请注意,-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 ""
)
按默认,CMAKE_BUILD_TYPE为空,所以所有配置-具体设置省略
这就是为什么使用 CMAKE_CXX_FLAGS_*
变量 none 的原因,所以构建项目时没有 c++11
。
异常是 target_link_libraries
的 optimized 关键字:it works 对应于 any 非调试配置。
好的做法是为项目提供默认构建类型。 This post 为此推荐了不错的模板:
# 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()
问题总结。
我有一个使用 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 拉取一个 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 ""
)
按默认,CMAKE_BUILD_TYPE为空,所以所有配置-具体设置省略
这就是为什么使用 CMAKE_CXX_FLAGS_*
变量 none 的原因,所以构建项目时没有 c++11
。
异常是 target_link_libraries
的 optimized 关键字:it works 对应于 any 非调试配置。
好的做法是为项目提供默认构建类型。 This post 为此推荐了不错的模板:
# 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()