Это записки новичка, сделанные для моей команды, когда мы принимаем cmake. Вкратце резюмирует, что я думал, будет где-то в примере новичка. Хотя со ссылками и подходит для новичков, я очень новичок в материале, и этот пример может пострадать соответственно.
Общая информация по этому вопросу находится по адресу: https://cmake.org/Wiki/CMake:How_To_Find_Libraries - в частности, find_package
может быть использован на любом из названных пакетов, перечисленных командой справки:
CMake --help-модуль-лист Примечание: «Найти» опускается (например, FindLibXml2 -> find_package (libxml2))
Однако для этого типа библиотеки, более вероятно, что он не будет в этом списке, в этом случае вы хотите использовать find_library и find_path вместо этого. Простой пример:
find_library(SQLITE3_LIB sqlite3) # simple because I did not need to give paths
find_path(SQLITE3_PATH sqlite3.h)
target_link_libraries(your_target_name ${SQLITE3_LIB})
include_directories(${SQLITE3_PATH})
Вам не нужно, чтобы проверить, если у них есть в «-NOTFOUND» возвращаемого значения, потому что CMake будет завершаться с ошибкой, если они делают:
...
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
SQLITE3_LIB
linked by target "test" in directory /home/matlab/QFDC_ROOT/api
-- Configuring incomplete, errors occurred!
Обратите внимание, что все -капитализированные «SQLITE3_LIB» и «SQLITE3_PATH» - это имена переменных, которые я выбрал. Вы выбираете имена переменных. Если у вас есть другие библиотеки и включены каталоги, вы можете перечислить их до и после этого и разделять пробелами (я упорядочил их по порядку ссылок для обоих, хотя я считаю, что пути нечувствительны).
Ваш случай может быть не таким простым, и в этом случае вы хотите использовать функции CMake, описанные в find_library, для предоставления CMake дополнительной информации о том, где он должен найти эту библиотеку. Есть еще Q & A на эту тему - мой любимый - produce your own FindXXX.cmake (хотя это очень краткий ответ, указывающий на пример).
Во многих случаях полезно выполнить make VERBOSE=1
, чтобы помочь вам устранить проблему, например cd build && cmake .. && make VERBOSE=1
.
Для еще лучшей диагностики, я использовал DLRdave's answer для распечатки INCLUDE_DIRS и я использовал простое сообщение, чтобы вернуть результаты моих переменные:
message(STATUS "SQLITE3_LIB: ${SQLITE3_LIB} SQLITE3_PATH: ${SQLITE3_PATH}")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
foreach(dir ${dirs})
message(STATUS "dir='${dir}'")
endforeach()
EDIT Примечание: этот ответ был фактически переписан 2016- 04-08 после обнаружения того, что реализация предыдущего дня ошибочно и запуталась find_library() и find_path().
Не уверен в этом на 100%, но может быть, он устанавливает библиотеку в/usr/local, а затем Degate не может найти ее, потому что она ищет/usr - если это так, вы можете попробовать переустановить gtkglextmm, используя 'configure --prefix =/usr && make && make install'. – SteJ
@SteJ No. Do ** нет ** сделать это. Вы ** не ** устанавливаете, из источника, в '/ usr' в управляемой пакетами системе. Это ** спрашивает ** о проблемах, проблемах и боли. –
Предполагая, что cmake ищет файлы pkg-config, связанные с 'gtkglextmm', тогда у него, вероятно, просто нет соответствующего пути'/usr/local' для них. Вы можете попробовать установить 'PKG_CONFIG_PATH', чтобы указать соответствующий путь перед запуском cmake и т. Д. И посмотреть, поможет ли это. –