Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > помогите начать работать с GTK под Виндой


Автор: юзерпиг 29.8.2009, 15:11
Помогите новичку) 
Проект в eclipse + MinGW, понадобилось сделать простой GUI. 
Поставил GTK, сгенерил с помощью pkg-config флаги. Скопировал пример типа Hello world.
Вот что получается:

Код

make all 
Building file: ../src/test.c
Invoking: GCC C Compiler
gcc -mms-bitfields -IC:/GTK/include/gtk-2.0 -IC:/GTK/lib/gtk-2.0/include -IC:/GTK/include/atk-1.0 -IC:/GTK/include/cairo -IC:/GTK/include/pango-1.0 -IC:/GTK/include/glib-2.0 -IC:/GTK/lib/glib-2.0/include -IC:/GTK/include/libpng12 -IC:\GTK\include -IC:\GTK\include\gtk-2.0 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o"src/test.o" "../src/test.c"
Finished building: ../src/test.c
 
Building target: test.exe
Invoking: MinGW C Linker
gcc -LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl  -o"test.exe"  ./src/test.o   
./src/test.o: In function `main':
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:23: undefined reference to `gtk_init_abi_check'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:26: undefined reference to `gtk_window_new'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:28: undefined reference to `gtk_window_get_type'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:28: undefined reference to `g_type_check_instance_cast'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:28: undefined reference to `gtk_window_set_title'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:30: undefined reference to `gtk_window_get_type'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:30: undefined reference to `g_type_check_instance_cast'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:30: undefined reference to `gtk_window_set_default_size'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:32: undefined reference to `gtk_window_get_type'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:32: undefined reference to `g_type_check_instance_cast'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:32: undefined reference to `gtk_window_set_position'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:34: undefined reference to `gtk_widget_show'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:37: undefined reference to `g_type_check_instance_cast'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:37: undefined reference to `gtk_main_quit'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:37: undefined reference to `g_signal_connect_data'
D:/DOCUMENTS/eclipse/workspace001/test/Debug/../src/test.c:41: undefined reference to `gtk_main'
collect2: ld returned 1 exit status
make: *** [test.exe] Error 1


В C:/GTK/lib лежат все нужные либы. Что я не понимаю?  smile 

Автор: andrew_121 29.8.2009, 15:35
Ошибка линковки. Посмотри что с библиотеками.

Автор: юзерпиг 30.8.2009, 01:01
В C:/GTK/lib лежат такого вида пары библиотек:

gtk-win32-2.0.lib
libgtk-win32-2.0.dll.a

pkg-config генерит ключи вида -lgtk-win32-2.0

Это правильно? Мне казалось что -lgtk-win32-2.0 должен линковать libgtk-win32-2.0.a, но с такими именами библиотек нет.



Автор: shutffl 30.8.2009, 01:03
Правильно, так как в зависимости от системы (*NIX / Windows) подставится нужное расширение..

Автор: юзерпиг 30.8.2009, 01:16
Тогда собсно вопрос остается.. Библиотеки на месте.. Что ж он не линкует их?

Автор: shutffl 30.8.2009, 01:24
Цитата(юзерпиг @ 30.8.2009,  01:16)
Тогда собсно вопрос остается.. Библиотеки на месте.. Что ж он не линкует их?

Когда я в свое время возился с GTK, то надо было в переменну среды PATH дописать расположение.

Автор: юзерпиг 30.8.2009, 01:34
Не, это ничего не дает(( 
Пути все вроде прописаны где надо.... Тем более не вручную, а pkg-config сгенерил, т.е. должно быть правильно. Пробовал вручную то же прописать..

Автор: andrew_121 30.8.2009, 01:46
Цитата(юзерпиг @  30.8.2009,  01:01 Найти цитируемый пост)
gtk-win32-2.0.lib

Попробуй скопировать ее же с расширением .a

Автор: юзерпиг 30.8.2009, 13:08
Решение проблемы с линковкой нашлось, ключи -l<название либы> надо писать обязательно после *.o, а не до, этот порядок вызова описан в документации. (Вот ведь знал же про это, а тут забыл =))

Теперь все линкуется, но при запуске вылетает ошибка: 

Точка входа в процедуру g_access не найдена в библиотеке DLL libglib-2.0-0.dll

Библиотека на месте, в PATH путь прописан... Копирование этой DLL в папку с файлом ничего не меняет... 
В чем тут дело может быть?

Автор: andrew_121 30.8.2009, 19:02
Цитата(юзерпиг @  30.8.2009,  13:08 Найти цитируемый пост)
Точка входа в процедуру g_access не найдена в библиотеке DLL libglib-2.0-0.dll

Возможно длл-ка собрана другим компилятором.

Автор: юзерпиг 31.8.2009, 00:36
то есть другой версией GCC?
как с этим бороться?

Автор: andrew_121 31.8.2009, 02:17
Цитата(юзерпиг @  31.8.2009,  00:36 Найти цитируемый пост)
то есть другой версией GCC?

Нет.
Библиотека может быть собрана в msvc а длл-ка в мингве, или на оборот.
Еще вариант, библиотека release а длл-ка debug, или на оборот.

Автор: юзерпиг 31.8.2009, 09:21
Цитата(andrew_121 @ 31.8.2009,  02:17)
Библиотека может быть собрана в msvc а длл-ка в мингве, или на оборот.

так это библиотека с GTK поставляется.. они рекомендуют mingw.. я им и компилю...
не хотелось бы перебирать компиляторы(

Автор: andrew_121 31.8.2009, 10:17
юзерпиг, 
Цитата(andrew_121 @  31.8.2009,  02:17 Найти цитируемый пост)
Еще вариант, библиотека release а длл-ка debug, или на оборот. 


Автор: Любитель 31.8.2009, 14:19
Ммм.. Не в компиляторе даже дело - дело в используемом файле для линковки и самой длл-ки. Т. к. в литнкуемом файле "вшиваются" стабы для джампа на длл-ные функции.

Автор: korbian 31.8.2009, 15:46
Любитель, и если не ошибаюсь dlltool поможет решить эту проблему!

Автор: andrew_121 31.8.2009, 17:51
Цитата(Любитель @  31.8.2009,  14:19 Найти цитируемый пост)
Ммм.. Не в компиляторе даже дело - дело в используемом файле для линковки и самой длл-ки. Т. к. в литнкуемом файле "вшиваются" стабы для джампа на длл-ные функции. 

Я подумал что:
Цитата(andrew_121 @  31.8.2009,  02:17 Найти цитируемый пост)
Еще вариант, библиотека release а длл-ка debug, или на оборот.

Так как цель собирается.

Автор: Любитель 31.8.2009, 17:53
Я имею ввиду, что линковка быть может производится с файлом не от той длл-ки. Т. е. два разных билда (чем именно разных - вопрос другой, мб и дебаг/релиз). Именно в таком случае, всё соберётся, но работать не будет smile

Автор: юзерпиг 31.8.2009, 21:48
хм.. а откуда такое несоответствие версий могло произойти? у меня установлен GTK как есть, скачивал вроде бы одним пакетом...

Автор: Любитель 31.8.2009, 22:18
Больше длл-ок с таким же именем нигде нету в этом пакете?

Автор: andrew_121 31.8.2009, 22:24
Покажи версию компилятора. И ссылку откуда GTK скачал.

Добавлено через 32 секунды
И код выложи. Попробую скомпилить.

Автор: юзерпиг 31.8.2009, 23:13
огромное спасибо за советы) я пошарил в поисках библиотек и обнаружил аж несколько их, причем старых версий у себя в system32.. как и когда они туда попали - не понятно. с чем то когда то поставились, но я об этом не узнал.. 
теперь запускается окошечко (правда еще появляется консоль, не знаю пока как ее убрать), буду дальше ковыряться... чувствую вопросы еще будут..

Автор: andrew_121 31.8.2009, 23:24
Цитата(юзерпиг @  31.8.2009,  23:13 Найти цитируемый пост)
теперь запускается окошечко (правда еще появляется консоль, не знаю пока как ее убрать)

Добавь:
Код

-subsystem,windows

Автор: юзерпиг 1.9.2009, 00:35
Цитата(andrew_121 @ 31.8.2009,  23:24)
Добавь:
Код

-subsystem,windows

хм.. это ключик для линкера? он не признал такого((

Автор: andrew_121 1.9.2009, 00:47
юзерпиг, Да, для линкера. Не мог он не признать его.

Автор: юзерпиг 1.9.2009, 01:04
спасибо, разобрался) сделал так: gcc -Wl,--subsystem,windows

Автор: andrew_121 1.9.2009, 01:43
Ты работаешь в Eclipse? Он генерирует Makefile, или показывает командную строку для компиляции?
Выложи сюда.

Автор: юзерпиг 1.9.2009, 22:54
Да, в eclipse. Makefile написать поленился) забил все опции в настройки.
Для компиляции eclipse генерит вот что:

Код

###############################################################################
# Automatically-generated file. Do not edit!
################################################################################

# Add inputs and outputs from these tool invocations to the build variables 
C_SRCS += \
../src/test.c 

OBJS += \
./src/test.o 

C_DEPS += \
./src/test.d 


# Each subdirectory must supply rules for building sources it contributes
src/%.o: ../src/%.c
    @echo 'Building file: $<'
    @echo 'Invoking: GCC C Compiler'
    gcc -mms-bitfields -IC:/GTK/include/gtk-2.0 -IC:/GTK/lib/gtk-2.0/include -IC:/GTK/include/atk-1.0 -IC:/GTK/include/cairo -IC:/GTK/include/pango-1.0 -IC:/GTK/include/glib-2.0 -IC:/GTK/lib/glib-2.0/include -IC:/GTK/include/libpng12 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '


А это для линковки:

Код

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables 

# All Target
all: test.exe

# Tool invocations
test.exe: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: MinGW C Linker'
    gcc -Wl,--subsystem,windows -LC:/GTK/lib -o"test.exe" $(OBJS) $(USER_OBJS) $(LIBS)
    @echo 'Finished building target: $@'
    @echo ' '

# Other Targets
clean:
    -$(RM) $(OBJS)$(C_DEPS)$(EXECUTABLES) test.exe
    -@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets



Добавлено через 9 минут и 14 секунд
А что мне придется таскать с моей программой кроме библиотек? 
В C:\GTK\etc\gtk-2.0 есть файл gtkrc со строкой gtk-theme-name = "MS-Windows", проверил, вид окошек зависит от темы, если файла нет, тема какая-то совсем убогая, прям как в 3.11((

Автор: andrew_121 1.9.2009, 23:57
Не знаю как ты настроил эклайпс, но в нем нет нужных директив. тут я ничего порекомендовать не могу.

Автор: юзерпиг 2.9.2009, 00:26
Цитата(andrew_121 @ 1.9.2009,  23:57)
Не знаю как ты настроил эклайпс, но в нем нет нужных директив. тут я ничего порекомендовать не могу.

мм, ты о чем конкретно, каких директив нет? 

Автор: andrew_121 2.9.2009, 00:30
Цитата(юзерпиг @  2.9.2009,  00:26 Найти цитируемый пост)
каких директив нет?  

нужных директив для линкера нет.

Автор: юзерпиг 2.9.2009, 00:47
так нужные директивы я ж всегда могу вручную прописать?... а о каких директивах речь?

Добавлено через 3 минуты и 4 секунды
если речь о $(OBJS) $(USER_OBJS) $(LIBS), то они прописаны в отдельном файле

Автор: korbian 2.9.2009, 08:50
обратите внимание на эту строчку
Цитата(юзерпиг @  1.9.2009,  23:54 Найти цитируемый пост)
gcc -Wl,--subsystem,windows -LC:/GTK/lib -o"test.exe" $(OBJS) $(USER_OBJS) $(LIBS)

через опцию -L подключена директория от куда линковать библиотеки, а самих библиотек для линковки я не увидел(то есть опцию -l)
в настройках eclipse задействовать эти опции можно в этом окне:
user posted image

Автор: юзерпиг 2.9.2009, 09:55
Цитата(юзерпиг @ 2.9.2009,  00:47)
Добавлено @ 00:50
если речь о $(OBJS) $(USER_OBJS) $(LIBS), то они прописаны в отдельном файле

Да, у меня так и сделано. Библиотеки eclipse пишет в ${LIBS}, которая хранится в отдельном файле.
Вот эти файлы подключены:

Код

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include objects.mk

Автор: юзерпиг 2.9.2009, 21:16
Все таки остался вопрос, что мне придется таскать вместе со своей программой? Все эти длл-ки? И как быть с файлом gtkrc со строкой gtk-theme-name = "MS-Windows"? Если я перенесу свою программу на чистую винду, как мне установить тему? Подскажите кто знает..

Автор: andrew_121 2.9.2009, 21:22
Цитата(юзерпиг @  2.9.2009,  21:16 Найти цитируемый пост)
Все таки остался вопрос, что мне придется таскать вместе со своей программой?

http://www.google.ru/url?sa=t&source=web&ct=res&cd=2&url=http%3A%2F%2Fru.wikipedia.org%2Fwiki%2FDependency_Walker&ei=ureeSu3hHI-QsAbO_8ipAQ&rct=j&q=dependency+walker&usg=AFQjCNHVx7vw5CzDa89CknpaPXSgH0t21w&sig2=8jIGd-5fHYpvtKs2sz0bUw

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)