Ошибка компилятора GTK + 3 неопределенной ссылки на Windows - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать программу с графическим интерфейсом, используя gtk3, но я не могу скомпилировать программу, использующую библиотеку gtk! Я использую Windows 8, и я установил gtk, используя msys, следующим образом:

Я загрузил и установил MSYS2 с msys2 веб-сайта. Я использую 64-разрядную версию msys2 mingw-w64. Я обновил все, используя pacman -Syu, и выполнил pacman -S mingw-w64-x86_64-gtk3 base-devel mingw-w64-toolchain.

Затем я добавил ;C:\msys64\mingw64\bin к своему пути через Control Panel -> System and Security -> System -> Advanced system settings -> Environment Variables и под System variables я изменил переменную Path и добавил ;C:\msys64\mingw64\binв конце.

Затем я установил установку Code :: Blocks mingw, успешно 64-битную

Я создал консольное приложение -> Проект c -> Компилятор GNU GCC -> Создать проект.

Я вставил следующий код в файл main.c, переопределив все, что было там по умолчанию, с этим фрагментом кода

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    printf("Hello world!\n");
    return 0;
}

Я открыл настройки компилятора через Settings -> Compiler... -> Other compiler options и добавил pkg-config gtk+-3.0 --cflags с '`' на каждой стороне (не могу добавить это здесь, потому что это формат для кода ...

Затем я добавил pkg-config gtk+-3.0 --libs (снова с ´, но в другом направлении на каждой сторонеаргумент) в Linker settings -> Other linker options:

Когда я пытаюсь скомпилировать и запустить проект, я получаю это

Построить сообщения

|| === Build: Debug в gtkdev (компилятор: GNU GCC Compiler) === | c: \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 8.2.0 ........ \ mingw32 \ bin\ ld.exe: obj \ Debug \ main.o || в функции main':| C:\Users\name\Documents\development\gtkdev\main.c|7|undefined reference to gtk_init_abi_check '||| ошибка: ld вернул 1 статус выхода ||| === Сбой сборки: 2 ошибки, 0 предупреждений (0 минут, 0 секунд) === |ошибка: ld вернул 1 состояние выхода

Журнал сборки

mingw32-g ++. exe -o bin \ Debug \ gtkdev.exe obj \ Debug \ main.o -LC: / msys64 / mingw64 /Библиотека-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lintl -lglib-2.0 -LC: / msys64 / mingw64 / lib -lgtk-3 -lgdk-3 -lz -lgdi32 -limm32 -lshell32 -lole32 -Wl, -luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lg-2.0
c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: obj \ Debug \ main.o: в функции main': C:/Users/name/Documents/development/gtkdev/main.c:7: undefined reference to gtk_init_abi_check 'collect2.exe: ошибка: ld вернул 1 состояние выхода Процесс завершен со статусом 1 (0 минут, 0 секунд) 2 ошибок, 0 предупреждений(0 минут (с), 0 секунд (с))

Вывод pkg-config gtk+-3.0 --cflags в мсек

-pthread -mms-bitfields -IC:/msys64/mingw64/include/gtk-3.0 -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/atk-1.0 -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/pixman-1 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/lib/libffi-3.2.1/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include

Вывод pkg-config gtk+-3.0 --libs в мс.

-LC:/msys64/mingw64/lib -lgtk-3 -lgdk-3 -lz -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lintl -lglib-2.0

Использование флагов вместо использования pkg-config ничего не меняет. Компиляция main.c из командной строки Windows с использованием gcc и указанных флагов приводит к той же ошибке, что и в Code :: Blocks. Перемещение порядка опций / флагов разными способами не меняет ошибку. Например, наличие библиотек last и cflags непосредственно после gcc или main.c не изменяет вывод, я видел «решения», где должен быть определенный порядок компиляции и правильной компоновки всего, что не работает вОкно командной строки ни в Code :: Blocks, видимо. Более того, добавление опций компилятора и компоновщика в опциях сборки для проекта в Code :: Blocks тоже ничего не меняет. Все та же ошибка.

ПРИМЕЧАНИЕ. Когда я компилирую указанную выше программу с помощью консоли msys2 и компилирую ее с помощью gcc main.c -o run_me pkg-config --cflags --libs gtk+-3.0 Я получаю ошибки о -ldwmapi, но получаю файл run_me.exeэто работает так, как ожидалось. Я вставил в другой пример код gtk c в файл main.c и скомпилировал его с консолью msys, и он прекрасно компилирует и связывает exe-файл, даже удается безупречно создавать окна gtk. Это не является устойчивым, потому что ужасно кодировать в nano внутри консоли, которая не имеет автозаполнения.

...