Кросскомпиляция из под 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 шт):
GTK3 для винды есть в репозиториях MSYS2. Сам MSYS2 не работает под Wine, но пакеты можно скачать и распаковать вручную (но придется вручную определять и ставить зависимости их тех же репозиториев - это долго).
На правах саморекламы: я сделал скрипты, которые автоматически качают пакеты из этих репозиториев вместе с нужными зависимостями, и заодно вписывают пути к ним в нужные переменные окружения.
Инструкции по использованию есть в readme.
Минимальный пример выглядит так:
Читаем readme, ставим необходимые программы. На данный момент нужны
make,wget,tar,zstd.Устанавливаем сами скрипты, и качаем ими пакеты.
Все устанавливается в текущую папку. Никакого мусора нигде не остается, эту папку потом можно просто стереть.
git clone https://github.com/HolyBlackCat/quasi-msys2 cd quasi-msys2 make install _gtk3Теперь ставим нужные переменные окружения командой
source env/vars.src.Компилируем почти так же, но передаем в
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