Резюме вопроса.
У меня есть проект A, который я строю с использованием CMake, который компилируется чисто.
Однако когда я перетаскиваю A в другой проект B с помощью команды CMake ExternalProject_Add, компиляция завершается неудачно, когда она достигает точки построения A.
Вид ошибок, которые я получаю.
Компиляция B дает ошибки, подобные этой
warning: rvalue references are a C++11 extension [-Wc++11-extensions]
когда он начинает компилировать A (который снова вводится ExternalProject_Add).
Обратите внимание, что -std=c++11
устанавливается во всех задействованных файлах CMakeList.txt.
Обратите внимание, что я также тяну проект Google с помощью ExternalProject_Add, но это не вызывает никаких проблем.
Некоторая специфика из файлов CMakeLists.txt.
Следующий отрывок взят из 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()
Других решений пока нет …