Получение флага компилятора 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)
или очистите кэш вручную и будьте готовы к такому поведению.