LINUX.ORG.RU

CMake как подключить GTK в проект?


0

1

Доброго всем времени суток, пытаюсь перенести проект на cmake, написал простенький скрипт:

cmake_minimum_required (VERSION 2.6) 
 
set (PROJECT sb) 
 
project (${PROJECT}) 

set (HEADERS 
	./src/main_window.h
	./src/main_window_cb.h
	./src/route.h
	./src/draw.h
	./src/values_window.h)
 
set (SOURCES 
	./src/main_window.c
	./src/main_window_cb.c
	./src/route.c
	./src/draw.c
	./src/values_window.c
	./src/sb.c) 
 
add_executable (${PROJECT} ${HEADERS} ${SOURCES} )

но при компиляции ругается что не «видит» хидеров и либов GTK, как их прописать в cmake? Погуглил, но что-то там какие-то страшные решения пишут, как я понял нужно какие-то модули использовать, FindGTK вроде, правда сумбурно себе всё это представляю, что и как, объясните а пальцах :)

★★★★★

find_package(GTK2 REQUIRED)

После REQUIRED можно перечислить необходимые модули (glib-2.0 gtk-2.0 и т.д.)

Torvus ()

Да, забыл:

add_executable(${PROJECT} ${HEADERS} ${SOURCES} ${GTK2_LIBRARIES})

заголовочники будут в переменной GTK2_INCLUDES (куда там именно их вставлять сейчас не вспомню)

Torvus ()
Ответ на: комментарий от Kosyak

По-моему надо так:

find_package(GTK2 REQUIRED)
include(${GTK2_INCLUDE_DIRS})
add_executable(${PROJECT} ${SOURCES} ${GTK2_LIBRARIES})

Torvus ()
Ответ на: комментарий от Kosyak

А под виндой, как я понимаю, нужен виндовый FindGTK2.cmake

Torvus ()
Ответ на: комментарий от Kosyak

добавил эти строки, теперь у меня файл такой, но по прежнему не видит ни glib.h, ни например cairo.h... т.е пока он даже скомпилить не может, до сборки ещё не дошло дело... аверно что-то не так делаю :(

[code] cmake_minimum_required (VERSION 2.6) set (PROJECT sb) project (${PROJECT})

set (HEADERS    ./src/main_window.h    ./src/main_window_cb.h    ./src/route.h    ./src/draw.h    ./src/values_window.h) set (SOURCES    ./src/main_window.c    ./src/main_window_cb.c    ./src/route.c    ./src/draw.c    ./src/values_window.c    ./src/sb.c)

find_package(GTK2 REQUIRED) include_directories(GTK2_INCLUDE_DIRS)

add_executable(${PROJECT} ${HEADERS} ${SOURCES} ${GTK2_LIBRARIES}) [/code]

xterro ★★★★★ ()
Ответ на: комментарий от Torvus

Скомпилилось, теперь правда не собирается вываливает кучу undefined reference, причём ругается на всё подряд, как я понял не может слинковать по какой-то причине,

ndow.c:(.text+0x4d): undefined reference to `gtk_window_set_title'
values_window.c:(.text+0x68): undefined reference to `gtk_window_resize'
values_window.c:(.text+0x7c): undefined reference to `gtk_vbox_new'
values_window.c:(.text+0x91): undefined reference to `gtk_container_add'
values_window.c:(.text+0x9c): undefined reference to `gtk_widget_show'
values_window.c:(.text+0xa1): undefined reference to `gtk_tree_view_new'
values_window.c:(.text+0xce): undefined reference to `gtk_box_pack_start'
values_window.c:(.text+0xd9): undefined reference to `gtk_widget_show'
values_window.c:(.text+0xed): undefined reference to `gtk_hbox_new'
values_window.c:(.text+0x11a): undefined reference to `gtk_box_pack_start'
values_window.c:(.text+0x125): undefined reference to `gtk_widget_show'
values_window.c:(.text+0x131): undefined reference to `gtk_button_new_from_stock'
values_window.c:(.text+0x15e): undefined reference to `gtk_box_pack_start'
values_window.c:(.text+0x169): undefined reference to `gtk_widget_show'
values_window.c:(.text+0x175): undefined reference to `gtk_button_new_from_stock'
values_window.c:(.text+0x1a2): undefined reference to `gtk_box_pack_start'
values_window.c:(.text+0x1ad): undefined reference to `gtk_widget_show'
values_window.c:(.text+0x1b9): undefined reference to `gtk_button_new_from_stock'
values_window.c:(.text+0x1e6): undefined reference to `gtk_box_pack_end'
values_window.c:(.text+0x1f1): undefined reference to `gtk_widget_show'
values_window.c:(.text+0x207): undefined reference to `btn_add_value_clicked'
values_window.c:(.text+0x235): undefined reference to `g_signal_connect_data'
values_window.c:(.text+0x23a): undefined reference to `btn_delete_value_clicked'
values_window.c:(.text+0x268): undefined reference to `g_signal_connect_data'
values_window.c:(.text+0x26d): undefined reference to `btn_close_clicked'

xterro ★★★★★ ()
Ответ на: комментарий от xterro

Значит линкер не нашел библиотеки gtk. Вы ${GTK2_LIBRARIES} добавили в add_executable? Если не помогает, попробуйте target_link_libraries(${PROJECT} ${GTK2_LIBRARIES})

Torvus ()
Ответ на: комментарий от Torvus

О... сейчас всё собралось, после добавления target_link_libraries(${PROJECT} ${GTK2_LIBRARIES}) спасибо :) Интересно почему с ${GTK2_LIBRARIES} не получилось?

xterro ★★★★★ ()
Ответ на: комментарий от xterro

Все правильно. Это я тупанул. В add_executable перечисляются файлы для компиляции цели. Соответственно, в target_link_libraries перечисляются библиотеки, от которых зависит цель сборки.

Torvus ()
Ответ на: комментарий от Torvus

А откуда берутся эти переменные, типа GTK2_LIBRARIES или GTK2_INCLUDE_DIRS, они экспортируются откуда-то... это к тому что, если я захочу подключить какую-либо свою библиотеку? ...

xterro ★★★★★ ()
Ответ на: комментарий от xterro

Когда вы пишете find_library, cmake исполняет скрипт FindXXX.cmake, в котором и экспортируются все переменные. Стандартными являются XXX_FOUND, XXX_LIBRARIES, XXX_INCLUDE_DIRS, где XXX - имя библиотеки или модуля.

Чтобы cmake автоматически искал и подключал вашу собственную библиотеку, необходимо написать скрипт FindMyLibrary.cmake, а в CMakeLists.txt прописать

MyLibrary_dir(./) (кажется так, сейчас точно не вспомню)
find_library(MyLibrary)
Синтаксис Find скриптов неплохо описан в документации. Также будет полезно почитать стандартные скрипты

Torvus ()
find_package(GTK2 REQUIRED)
include(${GTK2_INCLUDE_DIRS})
add_executable(${PROJECT} ${SOURCES})
target_link_libraries (${PROJECT} ${GTK2_LIBRARIES})

Вот точный вариант

Divius ★★ ()
Ответ на: комментарий от Torvus

Да, кстати, в add_executable не обязательно перечислять свои заголовочники.

Не обязательно, но полезно. В этом случае они будут включены в генерированный проект (по-крайней мере это актуально для Visual Studio). И ещё если проект планируется собирать под венды следует в ADD_EXECUTABLE после имени цели указывать WIN32 если приложение не консольное.

Begemoth ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.