Lazarus компиляция под windows

Мысли Серого Кота

коты — они такие.

четверг, 11 октября 2012 г.

Кросскомпиляция в Lazarus для win32(x86) и win64

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

Выбор платформы, для которой будет компилироваться приложение делается в меню Project->Project Options->Compiler Options->Code Generation->Target platform
Здесь указывается:

  • Target OS — целевая операционная система, для Windows актуальны Win32 и Win64
  • Target CPU family — тип используемых команд процессора. Обычно это i386 или x86_64
  • Target processor — выбор поколения процессора. На сегодня не актуально — почти всегда можно оставлять default

Для компиляции под Win x32 и Win x64 я использую Win32/i386 и Win64/x86_64.

Существует возможность сделать несколько билд-модов (Project Options->Build Modes), в которых сохранить конфигурации под разные системы.
В таком случае кнопка выбора билда появится на панели кнопок, рядом с кнопкой запуска приложения.
К сожалению, нельзя сохранять эти моды между проектами, они привязываются только к текущему.

Но если бы можно было просто выбрать целевую операционку и спокойно перекомпилировать приложение под неё — эта заметка бы не появилась.
Установленный Lazarus может собрать приложение только под ту операционку, для которой он был скачан. Так, скачав версию для x64 вы не сможете собитать x86-приложения.
Нехватает некоторых файлов (пример для x86):

  1. lazarus32\lcl\units\i386-win32 (копируем всю папку в lazarus64\lcl\units\)
  2. lazarus32\fpc\2.x.x\units\i386-win32 (копируем всю папку в lazarus64\fpc\2.x.x\units\)
  3. lazarus32\fpc\2.x.x\bin\i386-win32\ppc386.exe (копируем 1 файл в lazarus64\fpc\2.x.x\bin\x86_64-win64)

Эти недостающие файлы берутся из соответствующей версии Lazarus:
поставили lazarus x86, скопировали из него файлы в lazarus x64, удалили x86 версию.

После этого можно без ошибок выбирать x86-версию для компиляции и радоваться жизни.

Lazarus компиляция под windows

Итак, наконец-то я добрался и до кросскомпиляции. Не то, чтобы мне было это сильно надо (я по-прежнему считаю, что надежнее собирать проект на той ОСи, для которой он предназначен), но тут просто стало интересно. Про кросскомпиляцию на Wiki (особенно под Windows) рассказано в довольно общих чертах и не добавляет ясности в этом вопросе 🙂

Различают Host-платформу (сборка Лазаруса, на которой собирается проект) и Target-платформу (ОСь определенной разрядности, для которой собирается проект). Я опишу процесс сборки кросскомпилятора для Linux_i386 (Target) на win-x32 сборке Лазаруса (Host) и для Windows x32 (Target) на линуксовой i386 сборке Lazarus.

1. Кросскомпиляция на Windows.

1. Для начала скачиваем отсюда и запускаем последний релиз замечательной программки fpcupdeluxe нужной разрядности и соответствующей ОСи

2. Определяем директорию, куда будут скачаны исходники и собраны бинарные файлы (напр., D:\Archive\development\fpcup)
3. В окне «FPC version» выбираем «trunk» и жмакаем кнопку «Only FPC» (если Lazarus у вас еще не установлен, можно установить заодно и его, выбрав соответственно тип сборки в окне «Lazarus version» и нажав «Install/Update FPC + Laz»)

4. После установки FPC (и Лазаруса, если его не было) необходимо скачать сорцы и библиотеки, а также и скомпилировать бинарники для кросскомпиляции

Выбираем требуемую разрядность и ОСь (напомню, я задался целью собрать кросскомпилятор для Linux-i386) и жмем кнопку «Install cross-compiler».

В процессе закачки и последующей сборки fpcupdeluxe ругнется на отсутствие утилит для сборки кросскомпилятора и предложит их скачать («The building of a crosscompiler failed due to missing cross-tools. Fpcupdeluxe can try to download them if available! Do you want to continue?»)

Соглашаемся и повторяем процесс сборки. Он довольно длительный по времени, поэтому стоит запастись терпением. По окончанию процесса в информационной панели можно будет увидеть, куда установились бинарники кросскомпилятора:

Читайте также:  Что за звук при запуске mac os

5. Теперь настраиваем Лазарус. Забегая вперед, скажу, что для кросскомпиляции лучше использовать отдельную сборку среды, чтобы не мучиться с переключением (как сделать, чтобы IDE сохраняла настройки в «своей» папке).

Для указания путей к бинарникам открываем настройки Tools —> Options —> Environment —> Files

  • для Compiler executable выбрать D:\Archive\development\fpcup\fpc\bin\i386-win32\ppcross386.exe
  • для FPC source directory выбрать D:\Archive\development\fpcup\fpcsrc
  • для «Make» executable выбрать D:\Archive\development\fpcup\fpc\bin\i386-win32\make.exe

Для настройки отладчика идем сюда Tools —> Options —> Environment —> Debugger

  • выбрать GNU debugger (gdb)
  • выбрать путь D:\Archive\development\fpcup\fpcbootstrap\gdb.exe

Закрываем окно с настройками среды.

6. И, наконец, создаем новый проект, открываем его настройки Project —> Project Options —> Compiler options —> Paths, где указываем путь к библиотекам для сборки проекта

  • для Libraries (-Fl) выбрать d:\development\fpcup\cross\lib\i386-linux (отобразится ..\..\..\development\fpcup\cross\lib\i386-linux)

Указываем целевые ОСь и разрядность процессора, для которых компилируется проект Project —> Project Options —> Compiler options —> Congig and Target

  • для Target OS (-T) выбрать Linux
  • для Target CPU family (-P) выбрать i386

Если после указания Libraries (-Fl) автоматически не установилась ссылка на виджеты Target-ОСи, то устанавливаем их вручную Project —> Project Options —> Compiler options —> Additions and Overrides

  • в комбобоксе «LCLWidgetType» выбрать «Value «GTK2».

Теперь компилируем проект (лучше по + , иначе получим формальную ошибку отладчика). В окне сообщений после окончания процесса сборки получаем положительный результат

Проверяем полученный бинарник на целевой ОСи

2. Кросскомпиляция на Linux.

В качестве линуксовой ОСи я опишу установку на Debian 9. Рабочей директорией для fpcupdeluxe будет /home/leyba/development/fpcup.

1. Устанавливаем svn-клиент, если он еще не установлен
2. Если у вас не установлены пакеты для компиляции Lazarus, то сначало будет выдано предупреждение об отсутствии отладчика

fpcupdeluxe: WARNING: LazarusNativeInstaller (ConfigModule: lazarus): No GNU gdb found./home/leyba

а затем fpcupdeluxe прервет установку с сообщением об отсутствии библиотек

(9015) Linking ../lazarus
/usr/bin/ld: cannot find -lgdk-x11-2.0
/usr/bin/ld: cannot find -lX11
/usr/bin/ld: cannot find -lgdk_pixbuf-2.0
/usr/bin/ld: cannot find -lgtk-x11-2.0
/usr/bin/ld: cannot find -lpango-1.0
/usr/bin/ld: cannot find -lcairo
/usr/bin/ld: cannot find -lpangocairo-1.0

Поэтому последовательно качаем
и ставим пакет x11proto-print-dev
Затем и остальные пакеты одной строкой
(для Debian 9)
3. Ставим компилятор (и если необходимо, то и Lazarus) аналогично тому, как это описано для Windows

4. Теперь устанавливаем кросскомпилятор аналогично описанному для Windows, но с той разницей, что нужно будет выбрать опции CPU = i386, OS = Windows

5. Открываем настройки Lazarus Tools —> Options —> Environment —> Filesи устанавливаем следующие опции

  • для Compiler executable выбрать /home/leyba/development/fpcup/fpc/bin/i386-linux/fpc.sh (установлено по умолчанию)
  • для FPC source directory выбрать /home/leyba/development/fpcup/fpcsrc (установлено по умолчанию)
  • для «Make» executable выбрать /usr/bin/make (установлено по умолчанию)

6. Для указания отладчика идем сюда Tools —> Options —> Environment —> Debuggerи устанавливаем опции

  • выбрать GNU debugger (gdb)
  • выбрать путь /usr/bin/gdb (установлено по умолчанию)

7. Создаем новый проект и в опциях проекта Project —> Project Options —> Compiler options —> Congig and Targetуказываем ОСь и разрядность CPU

  • для Target OS (-T) выбрать Win32
  • для Target CPU family (-P) выбрать i386

а также набор виджетов (напомню, мы планируем создать кросскомпиляцию приложения для win_x32) — идем сюда Project —> Project Options —> Compiler options —> Additions and Overrides

  • в комбобоксе «LCLWidgetType» выбрать «Value «win32»

Все, теперь можно сохранить проект, а затем скомпилировать его по + (но не запускать по — получите ошибку отладчика!)

Проверяем полученный бинарник на целевой ОСи

Как можно заметить, кросскомпиляция на линуксе во многом проще, чем на Windows.

Cross compiling for Win32 under Linux/ru

Contents

Заметки по кросс-компиляции исполняемых файлов Win32 из Linux

Начиная с 0.9.10 существует rpm ‘fpc-crosswin32’, который устанавливает необходимые утилиты binutils (например кросс ассемблер, кросс линкер), fpc .ppu файлы скомпилированные для win32 и вносит изменения в /etc/fpc.cfg.

Он не включает кросс-скомпилированные LCL .ppu файлы. Вам нужно скомпилировать их самостоятельно после установки, fpc-crosswin32.

Lazarus и Free Pascal Compiler

О кросс-компиляции — понимайте то что вы делаете

Это короткое введение для новичков. В последующих разделах описывается как настроить систему для кросс-компиляции, имеется ввиду работая под linux создавать исполняемые файлы win32 (или freebsd, или dawin, или. ) Почему кросс-компиляция: FreePascal это компилятор, преобразующий исходный код в исполняемые файлы (на машинном языке). Эти исполняемые файлы, кроме всего прочего, содержат информацию о том как операционная система запускает их на выполнение. Поэтому исполняемые файлы являются платформенно-зависимыми. Сам FreePascal не требует различных дистрибутивов. Он может создавать исполняемые файлы для многих платформ. Просто укажите ему это. Но компилятор — это только одна часть. Существует ещё ассемблер и линкер. И эти утилиты не способны создавать кроссплатформенный код. Поэтому были созданы специальные утилиты линкер ‘ld’ и ассемблер ‘as’ для каждой целевой платформы. Это binutils. После создания кроссплатформенных утилит все модули fpc pascal будут кросс-компилированы. Например, для каждой из целевых платформ существует отдельный файл system.ppu. Затем ваш конфигурационный файл fpc.cfg будет перенастроен, таким образом кросс-компиляция станет настолько лёгкой, что вы сможете забыть обо всех мелочах. То же самое нужно проделать и с LCL — lazarus component library. И после этого вы сможете кросс-компилировать программы на паскале для win32. Затем проверить их при помощи wine или скопировать на машину с Windows и протестировать на ней.

Читайте также:  Режим ярлыков windows 10

Почему из *nix в windows а не по-другому.

Основная причина — генерирование unix-бинарников на другой платформе (другой unix или Linux) более сложно. Более сложное статическое связывание, не говоря уж об остальном.

Придется использовать библиотеки из целевой платформы (gtk, glib, libc и т.д.), и множество дополнительных настроек для ld. (пути к библиотекам, путь к линкеру и т.д.)

Это было частично сделано (в статическом случае), но это сложно т.к. требует внесения изменений в файлы линкера и командную строку линкера, а также глубокого понимания о сборке бинарников Unix.

Скачивание исходных кодов FPC

Исполняемых файлов недостаточно, вам потребуются все исходники fpc. Обратитесь к www.freepascal.org. Вы можете использовать SVN или ежедневные сборки. Для следующих примеров исходники fpc были скачены в папку

Скачивание gnu binutils.

Например, binutils-2.18.tar.gz скачайте в

Кроссплатформенная сборка binutils

В репозитории fpcbuild существует скрипт для сборки binutils для всех поддерживаемых целевых платформ: install/cross/buildcrossbinutils

Скачиваем инсталлятор fpcbuild:

Создаём копию скрипта:

Правим переменные в начале нового скрипта.

Переменная BASE указывает на директорию сборки и установки. Директория должна быть пустой. Например:

Теперь разберёмся со скачанным файлом binutils. Если путь к скачанному файлу

/download/binutils-2.18.tar.gz то укажем

Скрипт будет автоматически соберёт это в

/download/binutils-2.18.tar.gz. Остальные переменные определяют какие целевые платформы мы имеем. По умолчанию их довольно много, поэтому компиляция может занять много времени (часы на слабых машинах). Для кросс-компиляции для Windows вам потребуется только

и закомментировать все остальные:

Затем запустите скрипт:

Скрипт создаст поддиректорию ‘logs’ с соответствующим содержимым. В случае чего, начните поиски оттуда.

Заметьте что для некоторых платформ (Linux,FreeBSD, win32) утилиты доступны в скомпилированном виде. Смотрите ftp://freepascal.stack.nl/pub/fpc/contrib/cross/

Кроссплатформенная сборка FPC

В рекозитории fpcbuild существует скрипт для сборки fpc под все поддерживаемые целевые платформы: install/cross/buildcrosssnapshot Создайте копию скрипта

Исправьте переменные в начале нового скрипта.

Вам потребуется изменить всего лишь CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS и TARGETS_CPU. Например:

Затем запустите скрипт:

После этого вы получите кросс-компилированные модули в

Конфигурирование вашего fpc.cfg

Откройте с правами рута /etc/fpc.cfg или создайте копию /etc/fpc.cfg to

/fpc.cfg и отредактируйте этот файл. Найдите в файле пути поиска модулей.

Примечание: В более старых версиях FPC вместо $fpcversion и $fpctarget использовались $version и $target.

Замените их специальными путями для других платформ. Например, для linux и кросс-компилированной win32:

Выполните: тестирование и устранение неполадок.

Кросс-компиляция LCL и компонентов lazarus

В коммандной строке:

Таким образом всё скомпилируется для win32 (включая IDE, что необязательно, но это сокращает объём манипуляций).

Или в IDE Сервис->Параметры сборки: отметим LCL, Synedit, Codetools, Регистрация пакетов и Интерфейс IDE как Очистить+Собрать, установми в поле Библиотека виджетов LCL значение win32/win64, а Целевая ОС — win32. Затем нажмём ‘Собрать’. Ваши файлы .ppu/.o скомпилированные для linux не будут перезаписаны и вам не нужно будет перекомпилировать их каждый раз, т.к. в рабочей папке будут созданы специальные директории для других целевых систем.

Читайте также:  Отображение значка компьютера windows 10

Коросс-компиляция проекта

Выберите Проект->Параметры проекта->Параметры компилятора->Генерация кода Целевая ОС=’win32′ и Проект->Параметры проекта->Параметры компилятора->Пути Библиотека виджетов LCL=’win32′. Вот и всё. При следующей компиляции будет создан исполняемый файл win32. IDE произведёт поиск утилит win32, поэтому компилятор будет работать с rtl для win32 вместо rtl для linux. Когда вы откроете другой проект или закроете текущий и откроете его вновь IDE автоматически установит настройки.

Подсказки по кросс-компиляции и Lazarus

Если вы создаете приложение/пакет для различных целевых ОС, вам необходимо действовать следующим образом: устранить баги, скомпилировать и протестировать приложение под linux, затем скомпилировать и протестировать его под win32, .. . Потому что обычно вы перезаписываете ваши .ppu файлы, и вам придётся перекомпилировать всё, каждый раз когда вы переключаете захотите изменить целевую ОС. Но это не обязательно. Lazarus поддреживает макросы.

Пример 1: Кросс-компиляция проекта для linux и win32.

Установите значение Проект-> Параметры компилятора->Пути->Каталог вывода модулей = $(TargetOS). Этот макрос будет заменён названием целевой ОС в нижнем регистре (например ‘linux’ для Linux, ‘win32’ для Win32). Каталог вывода модулей находится в директории вашего проекта (директории где расположен файл .lpi). Создайте директории с именами ‘linux’ и ‘win32’ в директории вашего проекта. Когда вы кликните на кнопке ‘Показать параметры’ в самом низу окна Параметры проекта, вы увидите -FElinux/ или -FEwin32/. Эта опция сообщает компилятору куда записать создаваемые файлы (файлы .ppu/.o).

Пример 2: Кросс-компиляция проекта для различных платформ и наборов виджетов.

Укажите Каталог вывода модулей следующим образом $(TargetCPU)/$(TargetOS)/$(LCLWidgetType) и создайте поддиректории для всех целей. Этот путь также используется LCL.

То же самое можно проделать и для пакетов.

Кросс-компиляция и пакеты Lazarus

Пакеты Lazarus не ограничены библиотеками. Они могут быть использованы для компиляции практически чего угодно. И IDE автоматически перекомпилирует их при необходимости. Пакеты могут наследовать опции компилятора. Например: проект, использующий пакет, наследует каталог вывода пакета. Другими словами: каталог вывода пакета добавляется в пути поиска модулей проекта. Посмотрите в IDE: Проект->Параметры проекта->Параметры компилятора->Унаследованные.

Наследование срабатывает единажды. Но существуют исключения: Целевая платформа (ОС и CPU) проекта переопределяет цель для всех используемых пакетов. Это значит, если вы укажете Целевую ОС в проекте = ‘win32’ и скомпилируете проект, IDE выполнит проверку на предмет необходимости перекомпиляции пакетов для Целевой ОС.

Пакет А имеет директорию вывода: lib/$(TargetOS) Проект использует А.

    Проект собирается для linux. IDE компилирует А для linux в

/lib/linux/, затем компилирует проект для linux.
Проект собирается для win32. IDE компилирует А для win32 в

/lib/win32/, затем компилирует проект для win32.

  • Проект снова собирается для linux. IDE проверяет, существует ли А для linux. Затем компилирует проект для linux.
  • Таким образом, использование макросов экономит много времени.

    Для Unix (в общих чертах)

    Опция -XLA используется для изменения зависимостей библиотек определённых в модулях. Формат -XLAold=new изменяет link-опцию ld -l

      на -l .

    Опция -XR (recent trunk) может быть использована для указания корня Целевой ОС. Она используется для:

    • добавления префикса к указанным по-умолчанию путям библиотек, в прошлом вы использовали -Xd и эти пути вручную. Например для i386-linux

    вместо следования в /lib, /usr/lib, и /usr/X11R6/lib к ld, будет следовать в /lib, /usr/lib, и /usr/X11R6/lib к ld.

    • определение местоположения библиотек С (linux-версий): glibc или uclibc. Например для uclibc будет принята попытка поиска по пути ‘ /lib/ld-uClibc.so.0’

    Для Linux под Win32

    Это просто, есть некоторая информация в buildfaq

    FreeBSD для sparc

    Я пытался кросс-компилировать из х86 для Sparc Solaris 9. Несмотря на то что результат не работал должным образом привожу мою командную строку:

    в компилятор / выполнить:

    /src/sollib директория которая содержит:

    • набор файлов .o из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
    • libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
    • набор файлов lib*.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so

    Иллюстрация проблемы при компиляции:

    Я подозреваю что ошибся с выбранными .o файлами.

    Для Mac OS X

    Авторы

    Эта страница была конвертирована из epikwiki version.

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