Кросскомпиляция из под Linux на Windows C++ gtk3

Я скачал mingw на Linux и скомпилировал обычный Hello, world! для Windows всё получилось!

Но мне нужно скомпилировать с библиотекой gtk+-3.0:

x86_64-w64-mingw32-g++ main.cpp -o main.exe `pkg-config --cflags --libs gtk+-3.0`

widget.hpp:1:10: fatal error: gtk-3.0/gtk/gtk.h: No such file or directory 1 | #include <gtk-3.0/gtk/gtk.h>

Вопрос, как мне подключить gtk+-3.0.


Ответы (2 шт):

Автор решения: HolyBlackCat

GTK3 для винды есть в репозиториях MSYS2. Сам MSYS2 не работает под Wine, но пакеты можно скачать и распаковать вручную (но придется вручную определять и ставить зависимости их тех же репозиториев - это долго).


На правах саморекламы: я сделал скрипты, которые автоматически качают пакеты из этих репозиториев вместе с нужными зависимостями, и заодно вписывают пути к ним в нужные переменные окружения.

Инструкции по использованию есть в readme.

Минимальный пример выглядит так:

  1. Читаем readme, ставим необходимые программы. На данный момент нужны make, wget, tar, zstd.

  2. Устанавливаем сами скрипты, и качаем ими пакеты.

    Все устанавливается в текущую папку. Никакого мусора нигде не остается, эту папку потом можно просто стереть.

    git clone https://github.com/HolyBlackCat/quasi-msys2
    cd quasi-msys2
    make install _gtk3
    
  3. Теперь ставим нужные переменные окружения командой source env/vars.src.

  4. Компилируем почти так же, но передаем в pkg-config флажок --define-prefix.

    x86_64-w64-mingw32-g++ main.cpp -o main.exe `pkg-config --define-prefix --cflags --libs gtk+-3.0`
    

    Результат работает под вайном.

    Флажок нужен потому, что в .pc-файлах (из которых pkg-config берет флаги) этих пакетов пути написаны с расчетом на то, что пакеты стоят в /mingw64, а у нас это не так. Этот флажок исправляет пути на настоящие.

    Вместо этого флажка надежнее будет сделать /mingw64 ссылкой: (путь поменяйте на тот, куда клонировали репозиторий)

    sudo ln -nfs "/home/holyblackcat/quasi-msys2/root/mingw64" /mingw64
    

Но можно сделать еще лучше.

По крайней мере в репозиториях убунты x86_64-w64-mingw32-gcc - слегка старый, 9.x. А вот репозиториях MSYS2 есть новенький GCC, который прекрасно работает под Вайном, но работает медленно.

Есть отличный вариант: поставить MSYS2 GCC только ради библиотек, которые идут с ним в комплекте, а кросс-компилировать уже Clang-ом, с помощью этих библиотек. Любая сборка Clang-а (в отличие от GCC) умеет кросс-компилировать под любую поддерживаемую архитектуру, поэтому просто ставим обычный Clang для линукса.

Дальше ставим пакеты:

git clone https://github.com/HolyBlackCat/quasi-msys2
cd quasi-msys2
make install _gcc _gtk3

На всякий случай делаем /mingw64 ссылкой (нужно исправить путь на свой, см. выше зачем нужна ссылка):

sudo ln -nfs "/home/holyblackcat/quasi-msys2/root/mingw64" /mingw64

Теперь, указываем версию кланга. Смотря какой вы поставили, экзешник может называться или просто clang (тогда делаем export WIN_CLANG_VER=NONE), или с версией, например clang-11 (тогда делаем export WIN_CLANG_VER=11).

Теперь запускаем env/shell.sh, и если все сделано правильно, то кланг должен запускаться командами win-clang и win-clang++, сразу со всеми флажками, нужными для кросс-компиляции.

Предупреждение: env/shell.sh кроме прочего настраивает ядро для прозрачного запуска экзешников через Wine (в консоли будут работать вещи типа ./foo.exe). Эта настройка сохраняется до ребута.

Для этого скрипт спросит пароль для sudo. Если рандомным скриптам из интернета нет доверия, то можно отказаться вводить пароль (Ctrl+C), ввести ту же команду руками, потом набрать sudo -k - чтобы sudo забыл только что введенный пароль, чтобы скрипт ничего не выполнил с этим сохраненным паролем. А потом перезапустить скрипт.

Или, если эта фича не нужна вообще, можно вместо env/shell.sh использовать менее продвинутый source env/vars.src, как в первом примере. Расковыряйте файлы, почитайте readme, посмотрите что за что отвечает, и какие именно фичи вам нужны, а какие нет.

→ Ссылка
Автор решения: Антон

Я нашёл проблему, просто скачайте бинарные файлы и перекинте их в директорию где расположен mingw. https://www.dropbox.com/sh/8d1qbh5dsp044on/AAANpCYDILO-G2gPeth0x-Vwa?preview=gtk%2B-gtkmm-3.22.0-mingw32-6.2.0-posix-dwarf.7z

→ Ссылка