Как скомпилировать C GTK3+ программу в Ubuntu для Windows?
Я использую и gcc-7 и mingw-w64. Я хочу скомпилировать программу a c gtk3+ в Linux, используя mingw, чтобы она создавала файл.exe, который можно запустить в windows. Я могу скомпилировать обычные программы c, используя mingw, но Я не могу скомпилировать программы gtk. Я могу скомпилировать программы gtk с помощью gcc, но не с помощью mingw.
Я установил Mingw, как сказано здесь:- https://stackoverflow.com/questions/38786014/how-to-compile-executable-for-windows-with-gcc-with-linux-subsystem
Теперь я хочу скомпилировать оконную программу, которую я получил с https://developer.gnome.org/gtk3/stable/gtk-getting-started.html
smit@smit-Aspire-5742:~/programs/c programs/test$ x86_64-w64-mingw32-gcc test.c `pkg-config --cflags gtk+-3.0 --libs`
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgtk-3.dll.a when searching for -lgtk-3
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgtk-3.dll.a when searching for -lgtk-3
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lgtk-3
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/li /libgdk-3.dll.a when searching for -lgdk-3
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgdk-3.dll.a when searching for -lgdk-3
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lgdk-3
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangocairo-1.0.dll.a when searching for -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangocairo-1.0.dll.a when searching for -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangocairo-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangoft2-1.0.dll.a when searching for -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangoft2-1.0.dll.a when searching for -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangoft2-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfreetype.dll.a when searching for -lfreetype
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfreetype.dll.a when searching for -lfreetype
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lfreetype
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfontconfig.dll.a when searching for -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfontconfig.dll.a when searching for -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lfontconfig
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangowin32-1.0.dll.a when searching for -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangowin32-1.0.dll.a when searching for -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangowin32-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpango-1.0.dll.a when searching for -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpango-1.0.dll.a when searching for -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lpango-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libatk-1.0.dll.a when searching for -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libatk-1.0.dll.a when searching for -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: cannot find -latk-1.0
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo-gobject.dll.a when searching for -lcairo-gobject
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo-gobject.dll.a when searching for -lcairo-gobject
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lcairo-gobject
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo.dll.a when searching for -lcairo
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/cairo.lib when searching for -lcairo
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo.dll.a when searching for -lcairo
/usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib
и так.......(я вставляю последнюю строку, так как этот вывод намного больше)
collect2: error: ld returned 1 exit status
Я уже прошел этот урок:- http://www.tarnyko.net/en/?q=node/45
Теперь снова просмотрите этот Tutorail, но на этот раз я скачал gtk+-bundle_3.6.4-20131201_win64.zip
и теперь я получаю этот вывод:-
smit@smit-Aspire-5742:~/programs/c programs/test$ x86_64-w64-mingw32-gcc test.c `pkg-config --cflags gtk+-3.0 --libs`
In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
from /usr/include/glib-2.0/glib/gtypes.h:32,
from /usr/include/glib-2.0/glib/galloca.h:32,
from /usr/include/glib-2.0/glib.h:30,
from /usr/include/gtk-3.0/gdk/gdkconfig.h:13,
from /usr/include/gtk-3.0/gdk/gdk.h:30,
from /usr/include/gtk-3.0/gtk/gtk.h:30,
from test.c:1:
/usr/include/glib-2.0/glib/gtypes.h: In function ‘_GLIB_CHECKED_ADD_U64’:
/usr/include/glib-2.0/glib/gmacros.h:232:53: error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
^
/usr/include/glib-2.0/glib/gmacros.h:229:47: note: in definition of macro ‘G_PASTE_ARGS’
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
^
/usr/include/glib-2.0/glib/gmacros.h:232:44: note: in expansion of macro ‘G_PASTE’
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
^
/usr/include/glib-2.0/glib/gtypes.h:422:3: note: in expansion of macro ‘G_STATIC_ASSERT’
G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
^
In file included from /usr/include/glib-2.0/gio/gio.h:46:0,
from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:28,
from /usr/include/gtk-3.0/gdk/gdk.h:32,
from /usr/include/gtk-3.0/gtk/gtk.h:30,
from test.c:1:
/usr/include/glib-2.0/gio/gcredentials.h: At top level:
/usr/include/glib-2.0/gio/gcredentials.h:75:1: error: unknown type name ‘uid_t’
uid_t g_credentials_get_unix_user (GCredentials *credentials,
^
/usr/include/glib-2.0/gio/gcredentials.h:79:52: error: unknown type name ‘uid_t’
uid_t uid,
^
2 ответа
Я пытался следовать этому уроку 5, а может и больше раз, и обнаружил, что не так. Я извлекал команды из неправильных каталогов и загружал неверную версию GTK+ 3 бинарных файлов Windows.
Моя версия mingw - mingw64, поэтому мне нужно было скачать win64
версия.
и я выполнял команду export PKG_CONFIG_PATH=/opt/gtk3-win64/lib/pkgconfig
из / opt / gtk3-win64, но мне нужно было выполнить эту команду из каталога, в котором находился мой файл test.c.
Я сделаю этот урок легким для будущих читателей.
устанавливать
mingw cross-compiler
по команде:sudo apt-get install mingw-w64
Загрузите GTK+ 3 бинарные файлы Windows отсюда (ссылка в этом руководстве старая, вот последняя ссылка: http://win32builder.gnome.org/). Загрузите соответствующую версию, поскольку я загружал не ту версию. Не делай ту же ошибку, что и я.
Распакуйте zip-файл в
/opt/gtkwin
(рекомендуется) по командеsudo mkdir /opt/gtkwin && sudo unzip <name of the zip file> -d /opt/gtkwin
Используйте каталог, в который вы распаковали ZIP-файл. В этом случае я извлек в
/opt/gtkwin/
и выполнил следующую команду:find /opt/gtkwin -name '*.pc' -exec sudo sed -e 's@^prefix=.*@prefix=/opt/gtkwin@' -i
Перейдите в каталог, в котором у вас есть
.c
файл, который вы, чтобы скомпилировать и выполнить эту команду:export PKG_CONFIG_PATH=/opt/gtkwin/lib/pkgconfig
Скомпилируйте программу:
для 64-битной:
x86_64-w64-mingw32-gcc test.c $(pkg-config --cflags gtk+-3.0 --libs)
для 32-битных:
i586-mingw32msvc-gcc test.c $(pkg-config --cflags --libs gtk+-3.0)
Также вы должны посетить этот урок, как я узнал это оттуда.
Это создаст .exe
файл, который не может быть запущен в UNIX, так как он предназначен для работы в DOS.
MXE дает хорошие результаты. Скомпилированный исполняемый файл загружается некоторое время, а также вызывает пустую командную строку. Тем не менее, это единственное, что я пробовал, и это работало удаленно.
Резюме:
- Установите MXE согласно официальному руководству.
-
x86_64-w64-mingw32.static-gcc -o OUTFILE.exe INFILE.c `x86_64-w64-mingw32.static-pkg-config --cflags --libs gtk+-3.0`
-
OUTFILE.exe
теперь должен быть готов к работе на компьютере с Windows. Скопируйте его и дважды щелкните по нему или запустите из командной строки.
Подробности
(В основном из их учебника) apt-get install autoconf automake autopoint bash bison bzip2 flex g++ g++-multilib gettext git gperf intltool libc6-dev-i386 libgdk-pixbuf2.0-dev libltdl-dev libssl-dev libtool-bin libxml-parser-perl lzip make openssl p7zip-full patch perl python ruby sed unzip wget xz-utils
git clone https://github.com/mxe/mxe.git
sudo mv mxe /opt/mxe
cd /opt/mxe
make MXE_TARGETS='x86_64-w64-mingw32.static' cc gtk3
Это должно создать кросс-компилятор, компоновщик и соответствующие библиотеки в формате . Все они будут называться как-то безумно, вроде . Это много, чтобы напечатать! Используйте make-файлы или что-то в этом роде, чтобы вам не приходилось вводить все это каждый раз.
Добавьте следующую строку в
~/.bashrc
(или любой другой скрипт, который ваша оболочка запускает автоматически):
export PATH=/opt/mxe/usr/bin:${PATH}
Закройте и снова откройте терминал.
echo $PATH
должна включать в себя
/opt/mxe/usr/bin
. Теперь вы можете скомпилировать вещи с помощью команды
x86_64-w64-mingw32.static-gcc
(используется как обычно). Обязательно используйте
x86_64-w64-mingw32.static-pkg-config
вместо штатного.
Заметки:
Возможно, исполняемые файлы, скомпилированные с помощью MXE, для меня медленные, потому что они тайно встраивают отладочные материалы. Может быть, mingw может взять флаги, исключающие это? Может быть, также есть флаги, чтобы не открывать пустую командную строку?
Некоторые из
apt-get
установка пакетов может быть ненужной, idk.
Ты должен сделать
make MXE_TARGETS='x86_64-w64-mingw32.static' cc gtk3
а не просто потому что
make
генерирует каждый пакет. Это занимает очень много времени и не работает со случайными пакетами. Некоторые из них можно исключить с помощью флага -o; Например,
make -o cloog -o gdal -o graphicsmagick
исключит
cloog
,
gdal
, а также
graphicsmagick
пакеты, но это не работает с некоторыми пакетами. Вы должны делать только те пакеты, которые вам нужны.
MXE_TARGETS='x86_64-w64-mingw32.static'
делает 64-битную версию (по умолчанию 32-битная). Кроме упаковки нам понадобится
cc
для и . Также обратите внимание, что это , а не просто
gtk
как говорится в их документации.
Краткое руководство для полных n00bs: использование
#includes
в библиотеках, помимо стандартной библиотеки C и вашей собственной работы, вам нужно
pkg-config
чтобы сообщить компилятору C, где они находятся. В принципе, команда
pkg-config --cflags --libs LIBRARY_NAME
, будет просматривать набор каталогов по умолчанию для
LIBRARY_NAME.pc
файлы, которые содержат инструкции для создания флагов, которые затем могут быть переданы в качестве аргументов в
gcc
.
Для
gtk3
является
gtk+-3.0
, почему-то. Если вы не можете понять, что
LIBRARY_NAME
для библиотеки вы обычно можете использовать
find
команда с подстановочным знаком. Например,
find /opt/mxe/usr -Iname gtk*.pc
.
I
в
-Iname
означает нечувствительность к регистру.