Нужна помощь, пытаясь заставить Cmake находить сторонние библиотеки

#c #integration #cmake #zlib #taglib

#c #интеграция #cmake #zlib #taglib

Вопрос:

В настоящее время у меня есть проект, который ссылается на две сторонние библиотеки. Эти библиотеки должны быть созданы сами по себе, а затем связаны с проектом. Один из них — taglib, а другой — zlib. Я заметил, что при использовании программы Cmake-gui в каталоге taglib вам необходимо указать, где был собран и установлен zlib.

Моя цель — заставить CMake сделать аналогичную вещь для моей программы. Поскольку место хранения этих библиотек будет непоследовательным, как я могу предложить пользователю указать путь к требуемым библиотекам?

Я надеюсь, что это достаточно конкретно.

Ответ №1:

В случае ZLib, файл FindZLIB.cmake предоставляется вместе с CMake, и вы можете «просто» поместить вызов find_package в свои cmakelists. При необходимости вы можете внести некоторые изменения в findzlib.cmake в соответствии с вашими потребностями. Например. добавление ZLIB_DIR в качестве дополнительной подсказки при поиске библиотеки. Затем пользователь может задать этот ZLIB_DIR.

Предполагая, что ваша библиотека / исполняемый файл называется YourProject, вы можете использовать его следующим образом.

 find_package( ZLIB REQUIRED )
if ( ZLIB_FOUND )
    include_directories( ${ZLIB_INCLUDE_DIRS} )
    target_link_libraries( YourProject ${ZLIB_LIBRARIES} )
endif( ZLIB_FOUND )
  

Вы должны использовать тот же подход для TagLib, но вместо этого должны написать свой собственный файл FindTagLib.cmake (или поискать хороший).

Важной частью здесь является то, что вы предоставляете пользователю возможность установить переменную TagLib_DIR, которую вы используете для поиска TagLib и которую вы используете FindPackageHandleStandardArgs для сообщения об успехе или сбое.

Комментарии:

1. Итак, все, что я делаю, это помещаю этот FindTaglib.cmake в тот же каталог, что и CMakeLists.txt ?

2. Он выполняет поиск FindTagLib.cmake в CMAKE_MODULE_PATH. Я не уверен, что основной каталог с CMakeLists.txt уже есть. Если нет, вы можете добавить это: set( CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})

Ответ №2:

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

 cmake -D<VAR_NAME>:STRING=<path to custom zlib> .
  

предоставить cmake пользовательское расположение zlib или taglib.

Не забудьте обновить FindZLIB.cmake для обработки этих переменных в FIND_PATH и FIND_LIBRARY