Ну соль того же билдбота как раз в том, чтобы собирать платформонезависимо. Какие билд машины используете? Посмотрите на организацию сборщика у ScummVM (это отличный пример действительно кроссплатформенного приложения)
Преследовалось несколько целей. Самая главная из них — централизованная сборка, т.е. кросс-компиляция позволяет нам выделить одну машину (в нашем случае linux-сервер с OpenSuse), на которой осуществляется сборка приложения под все поддерживаемые операционные системы. Таким образом мы избавляемся от гетерогенности, и поддержка процесса сборки упрощается. Тестировать безусловно необходимо в Windows, после сборки приложение тестируется в родных системах.
Представьте — я разработчик и работаю в среде Ubuntu, я меняю что-то в исходных кодах. Теперь мне нужно проверить не сломалась ли при этом приложение в Windows, я просто кросс-компилирую, вместо того что бы держать еще одну полностью настроенную win-машину только для компиляции. Быстрее и удобнее. К слову можно делать кросс-компиляцию из win в nix, естественно.
Хм, насчет сервера кросскомпиляции я с вам соглашусь. Но как насчет идентичности окружения сборки и его влияния на получившийся бинарник? Есть ли какие-нибудь подводные камни?
Думаю есть как и везде. Например версия mingw компилятора из репозитория постоянно отстает от актуальной (не знаю уж насколько это критично). Не могу больше ничего плохого сказать, пока проблем не возникало (уже 4 месяца пользуюсь этой схемой компиляции). Могу предположить что могут быть проблемы если Вы захотите использовать какой-то специфичный функционал Windows, который не поддерживается mingw.
В Генте наоборот, самый последний компилятор в minGW, который опережает по версии тот, что идет в windows SDK.
Если захочется специфичный функционал Виндовс использовать, ну например win7 superbar, то проблемы и с обычным minGW почти нерешаемые возникнут(((
Я пробовал. Подводных камней никаких, в общем-то окружение идентичное — тот же самый ming32, и кстати есть возможность заюзать mingw64 и собирать под win64. А еще приятный бонус: компилятор и Qtшные утилиты навроде moc'а работают из Линукса процентов на 50 быстрее.
Пользуясь случаем, хочу спросить:
Я начинающий программист на QT. При компиляции и запуске получившегося exe-файла, у меня выскакивает системная ошибка о требовании библиотек. Когда я кидаю в папку с exe-шником необходимые dll-файлы, приложение запускается нормально.
ВОПРОС: Неужели придется таскать за exe-шником эти все примерно 130 Мб библиотек?
Добавлю еще, что как Вы возможно заметили есть библиотеки с постфиксом «d», эти библиотеки нужны для режима отладки, и таскать их с собой не надо, они как раз и составляют большую часть от тех 130 мб ;)
Кстати, строго аналогичным образом (но чуть сложнее) создается среда для кросскомпиляции под Симбиан. Работает этот зверек ну раз в 10 быстрее, чем родной SDK, запущенный из под Виндовса.
А Вы не знаете, с чем связана такая медленная работа виндового SDK? А то это ужасно напрягает. Сборка элементарного проекта занимает весьма ощутимое время.
По моим ощущениям тут виноват
1) Крайне тормозной перл
2) Какая-то ерунда с порождением процессов в Винде
3) Эта гадость начинает обсчитывать зачем-то все зависимости для сборки у каждого файла, в то время как в Линуксе она просто берет и пытается собрать.
4) windows SDK однопоточен!
Про многопоточность винды на примере прикручвания нитей к sbcl можете узнать много интересного в блоге широко известного в узких кругах dmitry_vk: dmitry-vk.livejournal.com/tag/win32
> Компилятор gcc/g++ 4.4.3 (поставляется вместе с Ubuntu)
На сколько я помню — не в ходит в базовый дистрибутив, а так же ставится с репозитория. Просто его привычно ставим при первой же необходимости.
При юзании системных qmake,moc, etc могут быть грабли, я бы рекомендовал скачать сырцы Qt для нужной платформы и сделать
configure -platform linux-g++ -xplatform нужная спека
После чего руками собрать qmake, moc,uic, и т.д. Остальное уже можно не собирать, а взять из Windows или Symbian SDK.
Вообще, для любых приложений процесс кросскомпиляции (относится как к win-nix, так и к nix-win) сводится к следующему:
1. Компиляция mingw (набор из компилятора, сборщика, ассемблера и прочих низкоуровневых утилит) с вашей платформы на целевую.
2. Компиляция всех зависимостей (ВСЕ библиотеки, включая популярные iconv, gettext, zlib, ...) под целевую платформу.
3. Компиляция самого приложения под целевую платформу.
GNU-тые утилиты и приложения использующие automake и autoconf, позволяют легко сконфигурировать исходники для кросскомпиляции путем задания скрипту ./configure ключей build и target. В самом запущенном случае придется лезть в Makfile'ы и править кое-что ручками.
Пункт 2 сложен, но позволяет получить приложение, в котором вы определяете все параметры сборки, включая static, поддержку nls и прочие.
>GNU-тые утилиты и приложения использующие automake и autoconf, позволяют легко сконфигурировать исходники для кросскомпиляции путем задания скрипту ./configure ключей build и target. В самом запущенном случае придется лезть в Makfile'ы и править кое-что ручками.
В половине случаев гнутый autohell какой-то мрак генерит вместо makefile'ов
Так ведь для конфигурирования и компиляции autohell (не слышал такого варианта, спасибо — повеселили) и не нужен. С ними мучаются разработчики, а клиенту остается лишь наковырять в консоли нужный configure и все…
К примеру для кросскомпиляции с 32 разрядной винды в 64-разрядную будет как-то так: ./configure --target=x86_64-w64-mingw32 --host=i686-pc-mingw32 при том, что minw для 64 разрядной платформы собран и лежит в нужном месте.
Знаю я, что в идеале так, а вот в реальности берет и не собирается((( Я так замаялся в свое время в Генте пытаться кросскомпилить libpurple и так и не смог справиться
Nsis 100% нормально работает под wine, мы как раз им собираем установщик для win версии. Главное кодировку nsi файла соблюсти (CP1251) и все будет хорошо.
Большое Вам спасибо за статью. За что люблю Хабр, вот только озадачишься какой-нибудь темой, как какой-нибудь добрый человек, вроде Вас, напишет статью и все разжует все :)
либо скомпилировать их с помощью кросс-компиляции из исходников (что, как мне кажется, будет очень не просто)
Ух сколько я потратил на это времени… но собрал, но без phonon'а, к сожалению. Мда, в самом деле — не просто. Потом в справочной системе прочитал, что phonon под mingw не собирается. Windows SDK ему подавай.
Qt & Ubuntu. Настраиваем среду для компиляции win32-приложений