2015-07-29 2 views
1

Итак, я пытаюсь создать приложение, которое требует gtkglextmm на CentOS. До сих пор я схватил источник (от here) за gtkglext и gtkglextmm и (наконец) понял, как их скомпилировать и установить с помощью ./configure, затем make, затем sudo make install. Было очень здорово заставить это работать.Как сделать пакет построен с возможностью установки для cmake?

Теперь, я пытаюсь построить Degate с cmake, и он жалуется, что не может найти gtkglextmm. Что мне нужно сделать, чтобы получить библиотеку gtkglextmm, которую я создал, доступную для cmake?

Перефразировать: Встроенная и установлена ​​библиотека a с make, make install. Теперь хочу создать приложение b, что зависит от a с cmake. Как?

Спасибо!

+0

Не уверен в этом на 100%, но может быть, он устанавливает библиотеку в/usr/local, а затем Degate не может найти ее, потому что она ищет/usr - если это так, вы можете попробовать переустановить gtkglextmm, используя 'configure --prefix =/usr && make && make install'. – SteJ

+0

@SteJ No. Do ** нет ** сделать это. Вы ** не ** устанавливаете, из источника, в '/ usr' в управляемой пакетами системе. Это ** спрашивает ** о проблемах, проблемах и боли. –

+1

Предполагая, что cmake ищет файлы pkg-config, связанные с 'gtkglextmm', тогда у него, вероятно, просто нет соответствующего пути'/usr/local' для них. Вы можете попробовать установить 'PKG_CONFIG_PATH', чтобы указать соответствующий путь перед запуском cmake и т. Д. И посмотреть, поможет ли это. –

ответ

0

Это записки новичка, сделанные для моей команды, когда мы принимаем 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().

Смежные вопросы