Компилятор linux для windows

Как с помощью Cygwin компилировать Linux-программы под Windows

Оригинал: How to Compile Linux Programs Under Windows with Cygwin
Автор: Gary Sims
Дата публикации: 12 июня 2014 г.
Перевод: Н.Ромоданов
Дата перевода: июль 2014 г.

Windows и Linux являются двумя очень разными системами и поэтому часто непросто портировать программы, написанные для одной из них на другую систему, особенно когда дело касается программ с графическим интерфейсом. Хотя есть много различных кросс-платформенных библиотек и пакетов SDK, нативные программы, написанные без учета портируемости, портировать довольно трудно.

Когда дело касается компиляции и запуска программ, написанных для Linux, в Windows, есть решение, известное как Cygwin. Проект Cygwin представляет собой набор наиболее распространенных инструментов и компиляторов (включая оболочки Bash и цепочку компиляторов GNU) для Windows. В его состав также входит библиотека, с помощью которой реализован слой совместимости, поэтому можно компилировать программы, в которых вызываются интерфейсы API, специфические для Linux. Cygwin не является эмулятором или виртуальной машиной, и он не позволяет двоичным файлам Linux работать на Windows без их предварительной перекомпиляции.

Перейдите на страницу установки Cygwin и скачайте 32-разрядную или 64-разрядную программу установки, (в зависимости от того, каким вариантом ОС Windows вы пользуетесь). Запустите программу установки. Нажмте кнопку Next (Далее) и снова ее нажмите для перехода в раздел “Install from Internet” («Установка из Интернета»). По умолчанию используется каталог «C:\cygwin». Его можно изменить, если это необходимо, но если у вас нет особых причин его изменять, то по умолчанию лучше использовать именно его. Нажмите кнопку Next, Next и еще раз Next.

У проект Cygwin по всему миру есть сайты зеркал; выберите то, которое, как вы думаете, лучше соответствует вашему местоположению, и нажмите кнопку Next. Теперь вам следует выбрать, какие пакеты будут установлены. Для компиляции простых программ Linux в Windows, вам понадобится цепочка компиляторов GNU (GCC), среди который предлагается компилятор С и C++.

В поле поиска наберите «gcc», а затем нажмите на маленький символ плюс, который находится в списке пакетов рядом с «Devel». Найдите «gcc-core» и «gcc-g++» и для каждого из них нажмите «Skip» («Пропустить»). Слово «Skip»превратится в номер версии, а обозначение «n/a» («Отсутсвует») в колонке «Bin?» превратится в позицию, в которой можно поставить отметку. В поле поиска наберите «make» и найдите «make» в разделе «Devel». Нажмите «Skip» для того, чтобы пометить его для установки. Найдите «wget», а также пометьте его для установки из «Web». Чтобы собрать пример, приведенный ниже, нам также потребуется библиотека «libiconv;» найдите ее и пометьте для установки.

Нажмите кнопку Next. После этого инсталлятор укажет, какие дополнительные пакеты необходимо установить с тем, чтобы разрешить зависимости. Нажмите Next для того, чтобы согласиться с рекомендациями.

После того, как все пакеты будут загружены и установлены, выполните прежде, чем произойдет выход из терминала, последние шаги настройки. Запустите терминал Cygwin с тем, чтобы войти в Linux-среду разработки. В терминале вы не сможете использовать команды Windows, например, команду dir, и сможете пользоваться только командами командной оболочки, например, ls.

Для того, чтобы продемонстрировать, как скомпилировать программу Linux в Windows, мы будем использовать пакет HTML-XML от W3. Чтобы узнать, что он может делать, поморите статью Как работать с файлами HTML и XML из командной строки.

Скачайте исходные файлы с помощью команды wget:

Теперь распакуйте архивный файл:

Исходные файлы теперь находятся в каталоге html-xml-utils-6.7. Перейдите этот каталог:

Исходные файлы теперь находятся в каталоге html-xml-utils-6.7. Перейдите этот каталог:

Прежде, чем файлы будут собраны, вам нужно будет запустить скрипт configure для генерации файла Makefile (файл инструкций по сборке), который предназначен для данной среды сборки. Это обычный шаг сборки на Linux (и в Cygwin) для построения пакетов из исходных кодов.

После того, как операция configure будет завершена, вы можете начать сборку с помощью команды make:

Сборка не прошла до конца из-за ошибки. Я был в нерешительности относильно того, что делать дальше. Я мог либо перейти на другой проект, либо сражаться с пакетом HTML-XML-utils. Я выбрал последнее, поскольку на нем показано, что не все гладко, когда вы пытаетесь компилировать программы Linux под Cygwin. Решение этой конкретной проблемы проста. Сообщение об ошибке показывает, что компоновщик не в состоянии найти библиотеку iconv. Беглый взгляд на команду компоновки показывает, что эта библиотека не указана. Быстрое и грубое решение представляет собой запуск команды вручную и задание инструкции компоновщику использовать библиотеку libconv. «Правильный» способ исправить эту ошибку состоит в анализе файла Makefile и т. д. с тем, чтобы выяснить, почему сборка не проходит.

Читайте также:  Средство построения конечных точек windows audio можно отключить

Выполните следующую команду, указав в конце «-liconv»:

После того, как файл hxindex.exe будет построен, можно переходить к остальной части сборки, набрав еще раз команду make. Когда работает команда make, она проверяет, что было собрано, а что — нет, а затем процесс сборки продолжается. Поскольку мы вручную собрали пакет hxindex.exe, команда make просто перенесет следующий двоичный файл в этот список.

Когда команда make завершить работу, у вас в каталоге html-xml-utils-6.7 будут все файлы .exe.

Если у вас при использовании Cygwin возникли проблемы, вы можете посмотреть часто задаваемые вопросы FAQ и документацию. Либо вы можете обратиться к спискам рассылки. Если у вас возникли проблемы с выполнением действий, описанных выше, то, пожалуйста, расскажите об этом в комментариях.

QtCreator: Qt кросс-компиляция из linux 64 в linux 32, win32, win64 и Mac OS X; upx, usb, dmg, etc

Библиотека Qt позволяет делать действительно кроссплатформенные приложения. Единожды написанный код можно откомпилировать под многие операционные системы. Но проблема именно в слове «компилировать», т.к. подразумевается, что необходимо перезагрузиться под целевую систему, иметь в ней настроенную среду разработки, установленный и настроенный зоопарк библиотек. Спасает кросс-компиляция — компиляция, производящая исполняемый код для платформы, отличной от той, на которой исполняется.

Кросс-компиляция для Windows 64

Обычно одной из наиболее востребованных проблем является сборка Windows-версии своего приложения, изначально разрабатывающегося под Linux. Пример решения этой проблемы можно увидеть тут или на русском. Необходимо создать mkspecs-конфигурацию, положить файлы Qt в соответствующие директории и всё. Компилировать Qt в таком случае не обязательно, можно скачать бинарники с официального сайта.
У такого подхода есть несколько минусов: 1) QtCreator об установленной таким образом библиотеке ничего не знает; 2) Официальной сборки Qt для Windows x64 не существует. И если с первой проблемой ещё как-то можно бороться, то против второй поможет только компиляция…

Перед кросс-компиляцией не забудьте поставить непосредственно сам кросс-компилятор (ищется в пакетом менеджере по названию «mingw»). И скачать исходники qt-everywhere с официального сайта. В директории mkspecs распакованного архива копируем папку win32-g++ в win64-x-g++ и корректируем содержимое файла qmake.conf. У меня получилось следующее:

По сути в файле спецификации были заменены только пути.

Я выполнял configure со следующими параметрами:
./configure -xplatform win64-x-g++ CROSS_COMPILE=x86_64-w64-mingw32- -prefix /usr/local/qt4win64 -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-multimedia -no-qt3support -fast -nomake demos -nomake examples -nomake tools -device-option -little-endian -qt-zlib -qt-libpng -qt-libjpeg -openssl-linked -no-fontconfig -no-3dnow -no-ssse3 -continue
Здесь собираю минимальную версию Qt без webkit, phonon, multimedia и т.п. Полный список опций можно посмотреть по команде ./configure —help

Соответственно, для такой сборки должен быть установлен пакет g++-mingw-w64-x86-64, содержащий в себе x86_64-w64-mingw32-g++ (в убунту пакет надо ставить отдельно).

Далее make && sudo make install. На первом этапе компиляции используется родной системный компилятор, он собирает необходимые утилиты для linux, которые будут использоваться для сборки уже windows-бинарников.
После установки у меня в /usr/local/qt4win64/bin лежат PE32+ DLL и несколько ELF 64-bit LSB executable, в том числе: qmake, uic, moc, rcc. Вот они то и пригодятся для QtCreator!

После установки не удаляйте распакованную директорию — она используется.

Кросс-компиляция для Windows 32

Аналогична компиляции для Win64. За исключением того, что есть официальная сборка, и саму библиотеку компилировать не нужно! Достаточно собрать qmake, uic, moc, rcc.

Кросс-компиляция для Mac OS X

Кросс-компиляция для мака тоже очень похожа, за исключением того, что надо будет собрать и компилятор. Я собирал по этой инструкции. Это отняло полный день времени и кучу нервов. В процессе будет нужна рабочая Mac OS X (как минимум на виртуальной машине) с установленным XCode, чтобы взять оттуда необходимые файлы. При компилировании своих Qt-приложений запущенная Mac OS X не нужна.

Помните, в Mac OS X для линковки с библиотекой .a-файлы не нужны.

Читайте также:  Windows media centre x64
Настройка QtCreator

Сначала нужно добавить в список все установленные компиляторы. Инструменты — Параметры — Сборка и запуск — Инструментарии:

QtCreator обычно нормально определяет ABI, но лучше перепроверить. Так же можно заметить, что системный x64 GCC в linux умеет генерировать и 32-битные приложения. Однако это не отменяет того, что также необходимы 32-битные версии библиотек.

После компиляторов можно добавить профили Qt:

Вот при добавлении профиля и пригодятся собранные ранее qmake, uic, moc, rcc, ведь нужно выбрать директорию с qmake. Жёлтый значок с восклицательным знаком слева от профиля означает warning, но QtCreator может использовать такой профиль Qt. А вот если значок красный, то профиль нерабочий. Такое может случиться при неправильной структуре каталогов. Или если удалить директорию, в которой компилировали Qt.

Следующие настройки нужно делать в каждом создаваемом проекте.
Для добавления конкретного профиля Qt надо при активном проекте зайти на вкладку «Проекты» (Ctrl+5):

По умолчанию в списке «Изменить конфигурацию сборки» есть только системный профиль Qt. Зато в списке кнопки «Добавить» есть все профили Qt, добавленные в параметры сборки.

В основных настройках сборки необходимо проверить пару библиотека-компилятор. Чтоб и то и другое было от одной и той же операционной системы.

Этапы сборки «qmake» и «Сборка» QtCreator ставит по умолчанию. А вот особые этапы «upx» и «dmgbuild» я добавил вручную для своего проекта. Этап «upx» выполняется каждый раз при нажатии на кнопку «Собрать проект». Однако если исполняемый файл не был изменён, то upx вернёт ошибку, что файл им уже обработан. В случае ошибки следующий этап не вызывается, т.е. dmg-файл обновится только если upx отработал успешно.

Для работы этапа upx он должен быть установлен в системе. Однако даже работая в linux-окружении и поставленный из пакетного менеджера upx умеет ужимать приложения: linux32/64, win32, macos32/64. Далеко не для всех проектов upx-сжатие реально нужно, этап показан скорее для примера.

Для этапа «dmgbuild» я воспользовался скриптом make_dmg. Ему нужны права root, поэтому добавил скрипт в файл /etc/sudoers

Изменения в проектном файле и использование сторонних библиотек

В моём проекте используется libusb, а это далеко не часть Qt. Также необходимо было включить платформенно-зависимую реализацию HID. В проектный файл были добавлены строки:

В Mac OS X и Linux линкуемся с системной libusb, в Windows в зависимости от разрядности линкуемся с libusb-1.0-32.dll.a или libusb-1.0-64.dll.a. Помним, что .a-файл может быть переименован, но зависеть приложение всё-равно будет от libusb-1.0.dll. В Linux параметры для libusb берём через системную утилиту pkgconfig. Кроме libusb подключаем для каждой операционной системы необходимые системные библиотеки и иконки.

Удобно разнести итоговые файлы для разных операционных систем по директориям. Сделать это можно так:

Цель win64-x-g++ относится к win32, однако в проектном файле идёт последней и переписывает настройки.

Кросс-компиляция и отладка C++ Windows-приложения под Linux

Показали мне недавно интересное приложение, под которое можно разрабатывать плагины. Приложение оказалось очень полезным для научной работы, но вот незадача — приложение разработано под Windows, у меня стоит Ubuntu. Windows для разработки под это приложение от лаборатории получить пока не удалось. Чтобы не тратить время, решил освоить кросс-компиляцию и отладку этого приложения.

Итого, имеется:
Ubuntu 12.10 x64
Не-юникодное приложение Мастерская Граф-Моделей (МГМ) (В командах консоли будет называться gmw.exe)

Нужно:
Разрабатывать и отлаживать плагины (dll-библиотеки), не устанавливая Windows.

И тут нам помогут Wine, Code::Blocks, портированное GDB, и boost.

Wine, не юникодное приложение, английский интерфейс Ubuntu и русский язык

При попытке открыть не юникодное приложение под Wine

получаются зюки следующего вида:

На эту проблему интернет очень быстро дает следующую подсказку:

В моём случае, данный подход не улучшил ситуацию ни на йоту.
Как выяснилось, русских локалей в системе не было добавлено (тыц).

Теперь запускаем с выше-указанной подсказкой

И, вуаля, запускается приложение с читаемым русским текстом:

Настройка IDE Code::Blocks для кросс-компиляции и отладки

Установка Code::Blocks

В дальнейшем для отладки нам потребуется менять код плагина отладки поэтому лучше сразу взять версию Code::Blocks из под svn.
Устанавливаем svn:

С помощью svn получаем код C::B, для этого переходим в папку, в которую хотим сохранить код C::B, где и набираем:

Переходим в полученную папку ‘trunk’.

Компиляция C::B происходит с помощью g++, autotools, automake и некоторых других утилит, которые необходимо установить:

Кроме того Code::Blocks зависит от wxWidgets:

Подстраиваем установщик под компьютер (можно запускать единожды):

Читайте также:  После установки виндовс нет линукса

И дальше, устанавливаем сам codeblocks (ключ —prefix можно упустить для использования настроек по-умолчанию):

Более подробно можно посмотреть по ссылке.

Настройка компиляции и линковки

Выполняем пункты с 1 по 5 с форума Code::Blocks. После этого компиляция программ должна работать, если не используется линковка к платформо-зависмым библиотекам (линковка с boost::regexp будет рассмотрена позже).
(*) В новом Code::Blocks немного изменилось меню по сравнению с инструкцией. Настройки искать нужно в ‘Settings->Compiler. ‘. Для старого Code::Blocks (10.05) пункт 5 нужно выполнить полностью, для нового же (12.11) настройку касающуюся gdb в 5 пункте пока трогать не будем.

Если используется boost его лучше положить отдельно от /usr/include, т.к. по этому адресу лежит много linux-специфичных заголовочных файлов, которые мы не хотим включать в проект при компиляции под Windows.

UPD: При настройке линковки в поле «Other Linker Options» имеет смысл добавить опцию «-Wl,—subsystem,windows,—kill-at», которая помечает, что это реально Windows DLL, и, что самое главное, запрещает использовать декорирование символов (—kill-at) при экспорте функций с соглашением вызова __stdcall. Подрбнее здесь и здесь.

Начиная с пункта 7 по ссылке выше, описывается кросс-отладка, но, к сожалению, insight.exe, упоминающийся в инструкциях, найти не удается. Поэтому пойдем своим путем.

Кросс-отладка в Code::Blocks & MingW32 gdb для Windows

gdb, который является родным для линукса частично умеет отлаживать Windows приложения, правда, умеет он только останавливаться на исключениях и почти всегда игнорирует точки останова. Чтобы справиться с этими проблемами скачиваем gdb в пакете mingw32 под Windows. Для этого скачиваем и затем распаковываем и переходим в подпапку ‘bin’. Устанавливаем gdb под Windows:

Теперь в этой же папке bin появился файл gdb.exe, он-то нам и нужен.

Создаем скрипт для имитации обычного gdb для этого в файл /usr/bin/i586-mingw32msvc-gdb

Заносим следующие строки:

Для старого C::B все уже настроенно, для нового же отладчик нужно настроить дополнительно. В пункте ‘Settings->Debugger’ кликаем по ‘GDB/CDB debugger’ затем по ‘Create Config’. В новом конфиге меняем команду запуска отладчика на ‘/usr/bin/i586-mingw32msvc-gdb’, остальные настройки по желанию. После этого идем в ‘Settings->Compiler. «, в пункте ‘Selected Compiler’ выбираем тот компилятор, который настраивали до этого и затем на вкладке ‘Toolchain executables’ меняем ‘Debugger’ на наш свежесозданный конфиг. Теперь отладчик будет останавливаться на точках останова, хотя и остановить программу в произволльный момент не сможет (данная проблема пока еще не решена). Правда при попытке отладить,C::B выдает следующую ошибку:

Эта ошибка говорит о том, что плагин отладчика в C::B не понимает выдачу отладчика gdb.exe. Как выяснилось при ближайшем рассмотрении плагин отладчика имеет платформо-зависимый код, и вот тут-то и нужно вспомнить что у нас есть исходники C::B. Мы сейчас слегка подкоррекируем код этого плагина. Нужно будет поменять код только одного файла ‘/src/plugins/debuggergdb/gdb_driver.cpp’
Для этого нужно перейти в корень проекта C::B (откуда запускалась команды ./bootstrap), по умолчанию это папка ‘trunk’. И накактить патч:

Ну и пересобираем Code::Blocks:

И почти все готово, остается только создать проект. Шаги 12-13 по ссылке. Если же вы хотите создать проект dll-библиотеки, то указывайти создание динамической библиотеки в мастере и переименовывайте разширение в dll.
Проверям, что в настройках проекта стоит выбранная нами цепь компилятор-линкер-отладчик. ‘<Правая клавиша на проект>-Build Options. ‘ пункт ‘Selected compiler’, и можно радоваться и отлаживаться. Напомню, что по какой-то причине отладчик не может быть прерван во время исполнения, т.е. все отладочные действия могут буть применены только во время останова программы. В частности нельзя поставить новую точку останова, если программа не стоит на какой-либо другой точке останова…

Линкование статической библиотеки boost’а

Библиотека boost в основном является набором заголовочных файлов, и потому никаких проблем с линковкой обычно не возникает. Но для некоторых частей boost’а необходимо линковаться к статической библиотеке, например, boost::regex. Пробуем собрать проект и получаем:

Ошибка возникает из-за того, что мы пытаемся прилинковаться к linux билиотеке, для того чтобы построить windows-приложение.
Чтобы слинковаться нужно скомпилировать boost::regex с помощью MingW32 (про кросс-компиляцию). Скачиваем boost, распаковываем и переходим в папку с распаковынным boost’ом. Создаем файл user-config.jam в корне домашней директории:

Со следующим содержанием:

Дальше настраиваем сборку и собираем:

После выполнения последней команды у меня были ошибки «failed updating 1 target», что, правда, не мешает собираться программам.

В результате, у нас есть полностью подготовленная среда для написания, сборки и отладки Windows-приложений или Windows-библиотек из под Linux. Теперь можно приступать к работе…

Оцените статью