#cmake
#cmake
Вопрос:
Моя цель — создать CMakeLists.txt файл, который создает набор программ для локальной системы. Если условия для создания некоторых программ не выполняются, я хочу иметь возможность создавать остальные программы. Камнем преткновения, похоже, является gtk, но имейте в виду, что я не думаю, что метод, специфичный для gtk, является лучшим выбором.
Для многих модулей, с которыми вы хотели бы работать, вы можете использовать
find_package(PkgConfig REQUIRED)
Чтобы настроить оболочку pkg-config pkg_check_Modules
, и если вы не используете REQUIRED
, вы можете проверить _FOUND
переменную:
pkg_check_Modules(FT REQUIRED freetype2)
if (FT_FOUND)
message(STATIC "Found freetype2")
#Continue and succeed, using FreeType library
else()
message(STATIC "Didn't find freetype2")
#Continue and succeed, without using FreeType library
endif()
Другие библиотеки, похоже, не работают с pkg_check_modules, поэтому я прибегнул к find_package
find_package(GTK2 2.0 QUIET gtk)
if (GTK2_FOUND)
...
endif()
Вот полное сокращение:
cmake_minimum_required(VERSION 3.6.2)
project (test C CXX)
set (SOURCE a.cpp b.cpp)
find_package(AMAZING 2.0 QUIET amazing_testing)
if (AMAZING_FOUND)
list(APPEND SOURCE c.cpp)
else()
list(APPEND SOURCE d.cpp)
endif()
add_executable(test ${SOURCE})
Вышесказанное позволяет полностью CMakeLists.txt чтобы перейти к концу, но я получаю сообщение об ошибке, makefile не создается, и build/CMakeFiles/CMakeOutput .в журнале даже не упоминается gtk:
CMake Error at gtk/CMakeLists.txt:4 (find_package):
find_package called with invalid argument "amazing_testing"
## here would be further cmake processing logs from other necessary setup
-- Configuring incomplete, errors occurred!
See also "/home/menright/bit/build/CMakeFiles/CMakeOutput.log".
Как я могу настроить такое использование find_package
, чтобы, если необязательный пакет не существует, настройка в любом случае завершилась успешно? В качестве альтернативы, что я должен использовать вместо find_package
этого, чтобы кратко настроить использование библиотеки так, как это делает pkg_check_modules, и все же разрешить успех, если библиотека недоступна?
Комментарии:
1. Просто
find_package(AMAZING 2.0 QUIET)
. Я не понимаю —find_package
также естьREQUIRED
опция, и она работает точно так же, как и вpkg_check_modules
. И я тоже не понимаюbut I get an error,
— да, как говорится в ошибке:find_package called with invalid argument "amazing_testing"
так что удалите этот аргумент.2. @ZamilCuk, я думаю, у вас в принципе есть ответ. Похоже, что, хотя я прочитал документацию find_package, я пропустил одну из подробностей о том, как использовать команду. первый параметр pkg_check_modules — это корень имен переменных, которые он будет заполнять результатами. С другой стороны, find_package проще, поскольку первым параметром является корень переменных и имя пакета.