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

В настоящее время у меня есть проект, который связывается с двумя сторонними библиотеками. Эти библиотеки должны быть построены сами по себе, а затем связаны с проектом. Один из них - 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, чтобы сообщить об успехе или неудаче.

Ответ 2

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

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

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

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