Как скомпилировать 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.

Я сделаю этот урок легким для будущих читателей.

  1. устанавливать mingw cross-compiler по команде:

    sudo apt-get install mingw-w64
    
  2. Загрузите GTK+ 3 бинарные файлы Windows отсюда (ссылка в этом руководстве старая, вот последняя ссылка: http://win32builder.gnome.org/). Загрузите соответствующую версию, поскольку я загружал не ту версию. Не делай ту же ошибку, что и я.

  3. Распакуйте zip-файл в /opt/gtkwin (рекомендуется) по команде

    sudo mkdir /opt/gtkwin && sudo unzip <name of the zip file> -d /opt/gtkwin
    
  4. Используйте каталог, в который вы распаковали ZIP-файл. В этом случае я извлек в /opt/gtkwin/ и выполнил следующую команду:

    find /opt/gtkwin -name '*.pc' -exec sudo sed -e 's@^prefix=.*@prefix=/opt/gtkwin@' -i
    
  5. Перейдите в каталог, в котором у вас есть .c файл, который вы, чтобы скомпилировать и выполнить эту команду:

    export PKG_CONFIG_PATH=/opt/gtkwin/lib/pkgconfig
    
  6. Скомпилируйте программу:

    • для 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означает нечувствительность к регистру.

Другие вопросы по тегам