Я пытаюсь создать программу с графическим интерфейсом, используя 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 внутри консоли, которая не имеет автозаполнения.