Получение флага компилятора CMake CHECK CXX для работы

Примечание: это мой первый раз, используя CMake. Я мало знаю об этом, поэтому я просто публикую кучу информации, чтобы увидеть, может ли кто-нибудь увидеть мою проблему.

Я хотел бы иметь возможность автоматически определять, какой флаг c++11 подходит, учитывая мой компилятор. Примеров этой линии много. Вот мои CMakeLists.txt следующий такой пример:

cmake_minimum_required (VERSION 2.8)

#Add the c++11 flag, whatever it is
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG(-std=c++0x COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
  message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

project(AnalyzeGames)
set(AnalyzeGames_SRCS AnalyzeGames.cpp)
add_executable(AnalyzeGames ${AnalyzeGames_SRCS})

вот мой вывод cmake при попытке использовать этот файл: http://pastebin.com/3AUwqffD

вот CMakeError.журнал: http://pastebin.com/EbNKvGt8

вот CMakeOutput.журнал: http://pastebin.com/kVJ0enJC

echo $CC:/usr/bin / gcc

echo $CXX:/usr/bin / g++

Я могу скомпилировать простой тестовый исполняемый файл с g++, используя любой флаг вручную.

cmake --version: cmake версия 2.8.12.2

по какой-то причине CMake не признавая, что мой компилятор поддерживает оба этих флага.

2 ответов


выход cmake говорит вам, что он не распознает '.расширение cxx, потому что оно не знает, что ваш проект является проектом c++. Чтобы исправить это, вы должны включить C++ в проект


TLDR

проверки компилятора выполняются только в переменной, переданной ранее не определенной, которая входит в кэш из предыдущих неудачных попыток. Использовать unset(my_var CACHE) чтобы заставить проверку всегда происходить, или просто знать об этом поведении и очистить кэш вручную, когда это необходимо.

деталь

у меня тоже была эта проблема (с cmake 2.8.12.2), и мне пришлось включить вывод трассировки и пройти через код, чтобы получить аналогичную игрушку для работы я должен был убедиться, что переменные, которые я использовал (COMPILER_SUPPORTS_CXX11_*) в эти призывы:

CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG(-std=c++0x COMPILER_SUPPORTS_CXX0X) 

были установлены так, что назвали себя:

set(COMPILER_SUPPORTS_CXX11 "COMPILER_SUPPORTS_CXX11")

другое решение для плакатов не работало для меня, оно в основном, казалось, ограничивало обнаружение компиляторов только CXX и игнорировало компилятор C.

проблема, похоже, связана с этой строкой кода в модуле cmake:

if("${VAR}" MATCHES "^${VAR}$")

что в выходных данных трассировки:

/usr/share/cmake/Modules/CheckCXXSourceCompiles.cmake(30):  if(COMPILER_SUPPORTS_CXX0X MATCHES ^COMPILER_SUPPORTS_CXX0X$ )

похоже, что выражение слева от MATCHES заменяется значением переменных, но выражение справа считается обычным текстом.

если MATCH сбой, затем основная часть макроса пропускается, и в соответствии с журналом проверка завершается неудачно.

глядя на более поздние версии этого макроса в Интернете, похоже, что эта строка изменилась, чтобы выполнить проверку компиляции, если переменная не определена.

это как в этот момент, что я понимаю, что это намерение / взлом исходного кода; если X не определено, то "X" MATCHES "^X$" будет true, но тогда проверка компиляции может быть выполнена, сбой по какой-то другой причине, а затем никогда не будет выполняться снова.

таким образом, решение является либо принудительным отключением переменной в кэше перед вызовом макроса с помощью:

 unset(COMPILER_SUPPORTS_CXX0X CACHE)

или очистите кэш вручную и будьте готовы к такому поведению.