Неопределенные справочные функции GTK с использованием GCC

0

Я использую GTK+ 3.x и MinWG GCC в Windows 7. У меня есть все пути, и все работает, чтобы скомпилировать, где это ошибка с помощью Undefined References.

C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x7): undefined reference to 'gtk_main_quit'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x41): undefined reference to 'gtk_init_abi_check'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x4d): undefined reference to 'gtk_window_new'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x85): undefined reference to 'g_signal_connect_data'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x91): undefined reference to 'gtk_label_new'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0x9a): undefined reference to 'gtk_container_get_type'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0xae): undefined reference to 'g_type_check_instance_cast'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0xbe): undefined reference to 'gtk_container_add'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0xca): undefined reference to 'gtk_widget_show'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0xd6): undefined reference to 'gtk_widget_show'
C:\Users\user\AppData\Local\Temp\cc8N3tch.o:helloworld.cpp:(.text+0xdb): undefined reference to 'gtk_main'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\user\AppData\Local\Temp\cc8N3tch.o: bad reloc address 0x20 in section '.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

Использование примера кода с сайта GTK

#include <gtk/gtk.h>

static void on_window_closed(GtkWidget * widget, gpointer data)
{
    gtk_main_quit();
}

int main(int argc, char * argv[])
{
    GtkWidget * window, * label;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect( window, "destroy", G_CALLBACK(on_window_closed), NULL);

    label = gtk_label_new("Hello, World!");

    gtk_container_add(GTK_CONTAINER(window), label);

    gtk_widget_show(label);
    gtk_widget_show(window);

    gtk_main();

    return 0;
}

Командный файл, который я использую для его создания

@echo off

set gtk_ver=gtk+-3.0
pkg-config %gtk_ver% --cflags --libs >tmp.txt
set /p pkg-info= <tmp.txt
del tmp.txt

rem echo &pkg-info%
gcc -o helloworld helloworld.cpp %pkg-info%

Вот как выглядит файл tmp.txt перед удалением

-mms-bitfields -IC:/gtk/include/gtk-3.0 -IC:/gtk/include/cairo -IC:/gtk/include/pango-1.0 -IC:/gtk/include/atk-1.0 -IC:/gtk/include/cairo -IC:/gtk/include/pixman-1 -IC:/gtk/include -IC:/gtk/include/freetype2 -IC:/gtk/include -IC:/gtk/include/libpng15 -IC:/gtk/include/gdk-pixbuf-2.0 -IC:/gtk/include/libpng15 -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include -LC:/gtk/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lpangocairo-1.0 -lpangoft2-1.0 -lfreetype -lfontconfig -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lm -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl 

Я пробовал редактировать партию, чтобы запустить gcc разными способами, но все сбой.

gcc %pkg-info% helloworld.cpp -o helloworld
gcc helloworld.cpp -o %pkg-info% helloworld //Gives me helloworld: no such file or directory
gcc helloworld -o %pkg-info% helloworld.cpp //Gives me helloworld: no such file or directory
gcc helloworld.cpp %pkg-info% -o helloworld

Причина, по которой я использую пакетный файл, заключается в том, что 'pkg-config --libs --cflags GTK+-3.0' завершается с ошибкой, так как pkg-config не существует. Запуск pkg-config на cl, а не с gcc, отлично работает.

pk-config из командного файла Mofi.

-mms-bitfields -IC:\gtk\include\gtk-3.0 -IC:\gtk\include\cairo -IC:\gtk\include\pango-1.0 -IC:\gtk\include\atk-1.0 -IC:\gtk\include\cairo -IC:\gtk\include\pixman-1 -IC:\gtk\include -IC:\gtk\include\freetype2 -IC:\gtk\include -IC:\gtk\include\libpng15 -IC:\gtk\include\gdk-pixbuf-2.0 -IC:\gtk\include\libpng15 -IC:\gtk\include\glib-2.0 -IC:\gtk\lib\glib-2.0\include -LC:\gtk\lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lpangocairo-1.0 -lpangoft2-1.0 -lfreetype -lfontconfig -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lm -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl

Командный файл Mofi с полными путями

@echo off
rem Get all options for build into an environment variable.
set "gtk_ver=gtk+-3.0"
"C:\gtk\bin\pkg-config.exe" %gtk_ver% --cflags --libs >"%TEMP%\gtk_options.tmp"
set /p pkg-info=<"%TEMP%\gtk_options.tmp"

rem Replace all / by \ in the environment variable.
set "pkg-info=%pkg-info:/=\%"
del %TEMP%\gtk_options.tmp

rem echo %pkg-info%
"C:\MinGW\bin\gcc.exe" %pkg-info% -o helloworld helloworld.c

PAUSE

Вы можете загрузить текстовый файл каталога gtk. (Извините, если он полон объявлений, это бесплатное место для удаления файлов. Неизвестно, как долго это будет продолжаться. Будет обновлено при его удалении)

  • 0
    @Mofi это все ошибки компоновщика; журнал ошибок даже не достигнет этой точки, если <gtk/gtk.h> не найден.
  • 0
    @Mofi Мофи, я не включаю. Это вывод команды pkg-config .
Показать ещё 1 комментарий
Теги:
batch-file
gcc
gtk
gtk3

2 ответа

0

в файле tmp.txt я не вижу флаг -lgtk-win32-3.0 ! , я думаю, вы используете пакет x64 gtk+,

если вы запускаете x64-окна, загрузите пакет x32 gtk+ вместо x64,

удачи,

0

Я не знаю, помогает ли приведенный ниже код командного файла в этом вопросе, поскольку у меня нет доступа к вашему компьютеру, и вы видите каталоги и файлы. Но попробуй.

@echo off
rem Get all options for build into an environment variable.
set "gtk_ver=gtk+-3.0"
"C:\gtk\bin\pkg-config.exe" %gtk_ver% --cflags --libs >"%TEMP%\gtk_options.tmp"
set /p pkg-info=<"%TEMP%\gtk_options.tmp"
del "%TEMP%\gtk_options.tmp"

rem Replace all / by \ in the environment variable.
set "pkg-info=%pkg-info:/=\%"

rem echo %pkg-info%
"C:\MinGW\bin\gcc.exe" helloworld.c -o helloworld %pkg-info%

Редактировать:

Я изменил порядок в последней строке, вызывающей GCC. Теперь заказ

  1. Исходный файл для компиляции.
  2. Имя выходного файла для создания.
  3. Все остальные параметры из конфигурации пакета.

Это редактирование было вызвано проблемой с компиляцией программы GTK3.

И я переименовал исходный файл в helloworld.c, так как файл содержит C, а не код C++. Расширение файла cpp приводит к автоматической компиляции файла в виде файла C++. Это может привести к ошибкам компоновщика, если gtk.h не содержит

#ifdef __cplusplus
extern "C" {
#endif

/* Function declarations */

#ifdef __cplusplus
}
#endif
  • 0
    Я обновил свой вопрос, добавив ссылку для скачивания текстового файла с каталогами и файлами, перечисленными для gtk. Такие же ошибки возникают при запуске вашего командного файла.
  • 0
    Даже после правок все равно не работает. Я думаю, что я собираюсь найти другую кроссплатформенную библиотеку графического интерфейса. Спасибо за помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню