Cross compiling for Win32 під Linux

Нотатки з крос-компіляції виконуваних файлів 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 не потребує різних дистрибутивів. Він може створювати виконувані файли для багатьох платформ. Просто вкажіть це йому. Але компілятор – це лише одна частина. Існує ще асемблер та лінкер. І ці утиліти не здатні створювати кросплатформовий код. Тому були створені спеціальні утиліти лінкер 'ld' та асемблер 'as' для кожної цільової платформи. Це binutils. Після створення кросплатформових утиліт усі модулі fpc pascal будуть крос-компільовані. Наприклад, для кожної з цільових платформ існує окремий файл system.ppu. Потім ваш конфігураційний файл fpc.cfg буде переналаштований, таким чином крос-компіляція стане настільки легкою, що ви зможете забути про всі дрібниці. Те саме потрібно зробити і з LCL - lazaruscomponent library. І після цього ви зможете крос-компілювати програми на паскалі для Win32. Потім перевірити їх за допомогою wine або скопіювати машину з Windows і протестувати на ній.

Чому з * 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 не будуть перезаписані і вам не потрібно буде перекомпілювати їх щоразу, тому що. у робочій папці буде створено спеціальні директорії для інших цільових систем.

Корос-компіляція проекту

Виберіть Проект->Параметри проекту->Параметри компілятора->Генерація коду Цільова ОС='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.