Обычно, когда вы хотите создать ссылку на библиотеку, в которой нет модуля find_package (например, это необычная библиотека или ваша собственная библиотека), вы можете использовать основные команды (команды find_X) для установки переменных с помощью пути, которые вам нужны. Затем вы используете эти переменные как с find_package (include_directories
, target_link_libraries
).
Если вы собираетесь использовать эту библиотеку из нескольких пакетов, вы можете создать модуль find_package; в основном он использует те же команды с определенными соглашениями.
Любой из них позволяет вам указать пути (в модуле CMake) для поиска, и они позволяют пользователю переопределять пути (переменные отображаются как опции в ccmake
/ cmake-gui
).
Я был бы рад добавить пример одного или обоих этих методов, просто дайте мне знать, что вы ищете.
Если вам просто нужно быстрое и грязное решение, вы можете сделать это, но я бы не советовал:
include_directories(/perso/testlib/include)
add_executable(myexecutable myexecutable.cpp)
target_link_libraries(myexecutable
/perso/testlib/lib/testlib1.a
/perso/testlib/lib/testlib2.a)
Что касается вашего вопроса о target_link_libraries
(# 5), вы можете сделать это несколькими способами. Если вы хотите, вы можете указать полное имя (например, target_link_libraries(myexe libfoo.a)
), но я думаю, что лучше (я полагаю, более переносимым) использовать короткое имя (например, target_link_libraries(myexe foo
). Вы также можете включить флаги компоновщика; Я не уверен, где я это прочитал, но я думаю, что он может перевести флаги -L и -l для разных компоновщиков.
Например, если у меня есть несколько библиотек в одном каталоге, и я знаю имена, я могу найти каталог, сохранить его в переменной и затем сделать это:
# First, find and set TESTLIB_LIBRARY_DIR, e.g. with find_path
# ...
# This assumes the libraries are e.g. 'libtestlib1.a' and 'libtestlib2.a'
set(TESTLIB_LIBRARIES
-L${TESTLIB_LIBRARY_DIR)
-l testlib1
-l testlib2)
add_executable(myexecutable myexecutable.cpp)
target_link_libraries(myexecutable ${TESTLIB_LIBRARIES})
Если вы хотите создать свой собственный модуль find_package (как упомянуто trenki, FindALSA.cmake
кажется хорошей отправной точкой), вы можете использовать его, добавив каталог в CMAKE_MODULE_PATH
; например, если вы поместили свои модули в подкаталог cmake/modules/
:
# Look for extra CMake modules in a subdirectory of this project
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/" ${CMAKE_MODULE_PATH})
Одна возможная проблема с FindALSA.cmake
: я не уверен, что CMAKE_CURRENT_LIST_DIR
будет работать. Поэтому я думаю, что вы должны сделать это изменение (вторая работа для меня в модуле, который я написал):
# Change this line
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
# To this (with no path/extension it will search the CMake modules path):
include(FindPackageHandleStandardArgs)
И чтобы получить использование FIND_PACKAGE_HANDLE_STANDARD_ARGS
, посмотрите FindPackageHandleStandardArgs.cmake
в каталоге CMake Modules.