Sign in Join
Wiki copytemporary

Cross compiling for Win32 under Linux/ru: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Заметки по кросс-компиляции исполняемых файлов Win32 из Linux
22
33Начиная с 0.9.10 существует rpm 'fpc-crosswin32', который устанавливает необходимые утилиты binutils (например кросс ассемблер, кросс линкер), fpc .ppu файлы скомпилированные для win32 и вносит изменения в /etc/fpc.cfg.
44
55Он не включает кросс-скомпилированные LCL .ppu файлы. Вам нужно скомпилировать их самостоятельно после установки, fpc-crosswin32.
66
77Также существует быстрый способ описанный тут: <http://wiki.lazarus.freepascal.org/Cross_compiling/ru>
88
99## Lazarus и Free Pascal Compiler
1010
1111### О кросс-компиляции - понимайте то что вы делаете
1212
1313Это короткое введение для новичков. В последующих разделах описывается как настроить систему для кросс-компиляции, имеется ввиду работая под linux создавать исполняемые файлы win32 (или freebsd, или dawin, или...) Почему кросс-компиляция: FreePascal это компилятор, преобразующий исходный код в исполняемые файлы (на машинном языке). Эти исполняемые файлы, кроме всего прочего, содержат информацию о том как операционная система запускает их на выполнение. Поэтому исполняемые файлы являются платформенно-зависимыми. Сам FreePascal не требует различных дистрибутивов. Он может создавать исполняемые файлы для многих платформ. Просто укажите ему это. Но компилятор - это только одна часть. Существует ещё ассемблер и линкер. И эти утилиты не способны создавать кроссплатформенный код. Поэтому были созданы специальные утилиты линкер 'ld' и ассемблер 'as' для каждой целевой платформы. Это binutils. После создания кроссплатформенных утилит все модули fpc pascal будут кросс-компилированы. Например, для каждой из целевых платформ существует отдельный файл system.ppu. Затем ваш конфигурационный файл fpc.cfg будет перенастроен, таким образом кросс-компиляция станет настолько лёгкой, что вы сможете забыть обо всех мелочах. То же самое нужно проделать и с LCL - lazarus component library. И после этого вы сможете кросс-компилировать программы на паскале для win32. Затем проверить их при помощи wine или скопировать на машину с Windows и протестировать на ней.
1414
1515### Почему из *nix в windows а не по-другому.
1616
1717Основная причина - генерирование unix-бинарников на другой платформе (другой unix или Linux) более сложно. Более сложное статическое связывание, не говоря уж об остальном.
1818
1919Придется использовать библиотеки из целевой платформы (gtk, glib, libc и т.д.), и множество дополнительных настроек для ld. (пути к библиотекам, путь к линкеру и т.д.)
2020
2121Это было частично сделано (в статическом случае), но это сложно т.к. требует внесения изменений в файлы линкера и командную строку линкера, а также глубокого понимания о сборке бинарников Unix.
2222
2323### Скачивание исходных кодов FPC
2424
2525Исполняемых файлов недостаточно, вам потребуются все исходники fpc. Обратитесь к www.freepascal.org. Вы можете использовать SVN или ежедневные сборки. Для следующих примеров исходники fpc были скачены в папку ~/sources/fpc.
2626
2727### Скачивание gnu binutils.
2828
2929Например, binutils-2.18.tar.gz скачайте в ~/download/binutils-2.18.tar.gz.
3030
3131### Кроссплатформенная сборка binutils
3232
3333В репозитории fpcbuild существует скрипт для сборки binutils для всех поддерживаемых целевых платформ: install/cross/buildcrossbinutils
3434
3535Скачиваем инсталлятор fpcbuild:
3636
37-` []$ cd ~`\
38-` []$ svn co `[`http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install`](http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install)` install`
37+```text
38+ []$ cd ~
39+ []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install install
40+```
3941
4042Создаём копию скрипта:
4143
42-` []$ cd ~/install/cross/`\
43-` []$ cp buildcrossbinutils buildcrossbinutils.sh`
44+```text
45+ []$ cd ~/install/cross/
46+ []$ cp buildcrossbinutils buildcrossbinutils.sh
47+```
4448
4549Правим переменные в начале нового скрипта.
4650
4751Переменная BASE указывает на директорию сборки и установки. Директория должна быть пустой. Например:
4852
49-` BASE=~/cross_fpc`
53+```text
54+ BASE=~/cross_fpc
55+```
5056
5157Теперь разберёмся со скачанным файлом binutils. Если путь к скачанному файлу ~/download/binutils-2.18.tar.gz то укажем
5258
53-` BINUTILSPATH=~/download/`\
54-` BINUTILSBASE=binutils`\
55-` BINUTILSVERSION=2.18`\
56-` BINUTILS_GZIP=yes`
59+```text
60+ BINUTILSPATH=~/download/
61+ BINUTILSBASE=binutils
62+ BINUTILSVERSION=2.18
63+ BINUTILS_GZIP=yes
64+```
5765
5866Скрипт будет автоматически соберёт это в ~/download/binutils-2.18.tar.gz. Остальные переменные определяют какие целевые платформы мы имеем. По умолчанию их довольно много, поэтому компиляция может занять много времени (часы на слабых машинах). Для кросс-компиляции для Windows вам потребуется только
5967
60-` TARGETS_WIN="mingw32"`\
61-` `
68+```text
69+ TARGETS_WIN="mingw32"
70+```
6271
6372и закомментировать все остальные:
6473
65-` #BSD="freebsd netbsd openbsd"`\
66-` #TARGETS_WIN="cygwin mingw32 msdosdjgpp"`\
67-` #TARGETS_I386="${BSD} linux solaris darwin"`\
68-` #TARGETS_POWERPC="${BSD} linux darwin"`\
69-` #TARGETS_SPARC="${BSD} linux solaris"`\
70-` #TARGETS_M68k=`
74+```text
75+ #BSD="freebsd netbsd openbsd"
76+ #TARGETS_WIN="cygwin mingw32 msdosdjgpp"
77+ #TARGETS_I386="${BSD} linux solaris darwin"
78+ #TARGETS_POWERPC="${BSD} linux darwin"
79+ #TARGETS_SPARC="${BSD} linux solaris"
80+ #TARGETS_M68k=
81+```
7182
7283Затем запустите скрипт:
7384
74-` []$ sh buildcrossbinutils.sh`
85+```text
86+ []$ sh buildcrossbinutils.sh
87+```
7588
7689Скрипт создаст поддиректорию 'logs' с соответствующим содержимым. В случае чего, начните поиски оттуда.
7790
7891Заметьте что для некоторых платформ (Linux,FreeBSD, win32) утилиты доступны в скомпилированном виде. Смотрите <ftp://freepascal.stack.nl/pub/fpc/contrib/cross/>
7992
8093### Кроссплатформенная сборка FPC
8194
8295В рекозитории fpcbuild существует скрипт для сборки fpc под все поддерживаемые целевые платформы: install/cross/buildcrosssnapshot Создайте копию скрипта
8396
84-` []$ cd ~/install/cross/`\
85-` []$ cp buildcrosssnapshot buildcrosssnapshot.sh`
97+```text
98+ []$ cd ~/install/cross/
99+ []$ cp buildcrosssnapshot buildcrosssnapshot.sh
100+```
86101
87102Исправьте переменные в начале нового скрипта.
88103
89104Вам потребуется изменить всего лишь CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS и TARGETS_CPU. Например:
90105
91-` CROSSTOOLSROOT=~/cross_fpc/cross`\
92-` FPCCVS=~/sources/fpc`\
93-` TARGETS_OS="win32"`\
94-` TARGETS_CPU="i386"`\
95-` DESTDIR=~/cross_fpc/`\
96-` `
106+```text
107+ CROSSTOOLSROOT=~/cross_fpc/cross
108+ FPCCVS=~/sources/fpc
109+ TARGETS_OS="win32"
110+ TARGETS_CPU="i386"
111+ DESTDIR=~/cross_fpc/
112+```
97113
98114Затем запустите скрипт:
99115
100-` []$ sh buildcrosssnapshot.sh`
116+```text
117+ []$ sh buildcrosssnapshot.sh
118+```
101119
102120После этого вы получите кросс-компилированные модули в ~/cross_fpc/
103121
104122### Конфигурирование вашего fpc.cfg
105123
106124Откройте с правами рута /etc/fpc.cfg или создайте копию /etc/fpc.cfg to ~/fpc.cfg и отредактируйте этот файл. Найдите в файле пути поиска модулей.
107125
108126Примечание: В более старых версиях FPC вместо \$fpcversion и \$fpctarget использовались \$version и \$target.
109127
110-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
111-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`\
112-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`
128+```text
129+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
130+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
131+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
132+```
113133
114134Замените их специальными путями для других платформ. Например, для linux и кросс-компилированной win32:
115135
116-`#IFDEF win32`\
117-`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/`\
118-`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/*`\
119-`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/rtl`\
120-`-XPi686-mingw32-`\
121-`-FD~/cross_fpc/cross/bin`\
122-`#ELSE linux`\
123-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
124-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`\
125-`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
126-`#-Fu~/fpc/packages/*;~/fpc/rtl/linux`\
127-`#ENDIF`
136+```text
137+#IFDEF win32
138+-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/
139+-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/*
140+-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/rtl
141+-XPi686-mingw32-
142+-FD~/cross_fpc/cross/bin
143+#ELSE linux
144+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
145+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
146+-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
147+#-Fu~/fpc/packages/*;~/fpc/rtl/linux
148+#ENDIF
149+```
128150
129151Выполните: тестирование и устранение неполадок.
130152
131153### Кросс-компиляция LCL и компонентов lazarus
132154
133155В коммандной строке:
134156
135-`cd lazarus; make clean all OS_TARGET=win32`\
136-`cd lazarus/lcl; make clean all `
157+```text
158+cd lazarus; make clean all OS_TARGET=win32
159+cd lazarus/lcl; make clean all
160+```
137161
138162Таким образом всё скомпилируется для win32 (включая IDE, что необязательно, но это сокращает объём манипуляций).
139163
140164Или в IDE Сервис-\>Параметры сборки: отметим LCL, Synedit, Codetools, Регистрация пакетов и Интерфейс IDE как Очистить+Собрать, установми в поле Библиотека виджетов LCL значение win32/win64, а Целевая ОС - win32. Затем нажмём 'Собрать'. Ваши файлы .ppu/.o скомпилированные для linux не будут перезаписаны и вам не нужно будет перекомпилировать их каждый раз, т.к. в рабочей папке будут созданы специальные директории для других целевых систем.
141165
142166### Коросс-компиляция проекта
143167
144168Выберите Проект-\>Параметры проекта-\>Параметры компилятора-\>Генерация кода Целевая ОС='win32' и Проект-\>Параметры проекта-\>Параметры компилятора-\>Пути Библиотека виджетов LCL='win32'. Вот и всё. При следующей компиляции будет создан исполняемый файл win32. IDE произведёт поиск утилит win32, поэтому компилятор будет работать с rtl для win32 вместо rtl для linux. Когда вы откроете другой проект или закроете текущий и откроете его вновь IDE автоматически установит настройки.
145169
146170### Подсказки по кросс-компиляции и Lazarus
147171
148172Если вы создаете приложение/пакет для различных целевых ОС, вам необходимо действовать следующим образом: устранить баги, скомпилировать и протестировать приложение под linux, затем скомпилировать и протестировать его под win32, .. . Потому что обычно вы перезаписываете ваши .ppu файлы, и вам придётся перекомпилировать всё, каждый раз когда вы переключаете захотите изменить целевую ОС. Но это не обязательно. Lazarus поддреживает макросы.
149173
150174Пример 1: Кросс-компиляция проекта для linux и win32.
151175
152176Установите значение Проект-\> Параметры компилятора-\>Пути-\>Каталог вывода модулей = \$(TargetOS). Этот макрос будет заменён названием целевой ОС в нижнем регистре (например 'linux' для Linux, 'win32' для Win32). Каталог вывода модулей находится в директории вашего проекта (директории где расположен файл .lpi). Создайте директории с именами 'linux' и 'win32' в директории вашего проекта. Когда вы кликните на кнопке 'Показать параметры' в самом низу окна Параметры проекта, вы увидите -FElinux/ или -FEwin32/. Эта опция сообщает компилятору куда записать создаваемые файлы (файлы .ppu/.o).
153177
154178Пример 2: Кросс-компиляция проекта для различных платформ и наборов виджетов.
155179
156180Укажите Каталог вывода модулей следующим образом \$(TargetCPU)/\$(TargetOS)/\$(LCLWidgetType) и создайте поддиректории для всех целей. Этот путь также используется LCL.
157181
158182То же самое можно проделать и для пакетов.
159183
160184### Кросс-компиляция и пакеты Lazarus
161185
162186Пакеты Lazarus не ограничены библиотеками. Они могут быть использованы для компиляции практически чего угодно. И IDE автоматически перекомпилирует их при необходимости. Пакеты могут наследовать опции компилятора. Например: проект, использующий пакет, наследует каталог вывода пакета. Другими словами: каталог вывода пакета добавляется в пути поиска модулей проекта. Посмотрите в IDE: Проект-\>Параметры проекта-\>Параметры компилятора-\>Унаследованные.
163187
164188Наследование срабатывает единажды. Но существуют исключения: Целевая платформа (ОС и CPU) проекта переопределяет цель для всех используемых пакетов. Это значит, если вы укажете Целевую ОС в проекте = 'win32' и скомпилируете проект, IDE выполнит проверку на предмет необходимости перекомпиляции пакетов для Целевой ОС.
165189
166190Пример:
167191
168192Пакет А имеет директорию вывода: lib/\$(TargetOS) Проект использует А.
169193
1701941. Проект собирается для linux. IDE компилирует А для linux в \<PackageDirOfA\>/lib/linux/, затем компилирует проект для linux.
1711952. Проект собирается для win32. IDE компилирует А для win32 в \<PackageDirOfA\>/lib/win32/, затем компилирует проект для win32.
1721963. Проект снова собирается для linux. IDE проверяет, существует ли А для linux. Затем компилирует проект для linux.
173197
174198Таким образом, использование макросов экономит много времени.
175199
176200## Для Unix (в общих чертах)
177201
178202Опция -XLA используется для изменения зависимостей библиотек определённых в модулях. Формат -XLAold=new изменяет link-опцию ld -l\<old\> на -l\<new\>.
179203
180204Опция -XR\<sysroot\> (recent trunk) может быть использована для указания корня Целевой ОС. Она используется для:
181205
182206- добавления префикса к указанным по-умолчанию путям библиотек, в прошлом вы использовали -Xd и эти пути вручную. Например для i386-linux
183207
184208вместо следования в /lib, /usr/lib, и /usr/X11R6/lib к ld, будет следовать в \<sysroot\>/lib, \<sysroot\>/usr/lib, и \<sysroot\>/usr/X11R6/lib к ld.
185209
186210- определение местоположения библиотек С (linux-версий): glibc или uclibc. Например для uclibc будет принята попытка поиска по пути '\<sysroot\>/lib/ld-uClibc.so.0'
187211
188212## Для Linux под Win32
189213
190214Это просто, есть некоторая информация в [[buildfaq]]
191215
192216## FreeBSD для sparc
193217
194218Я пытался кросс-компилировать из х86 для Sparc Solaris 9. Несмотря на то что результат не работал должным образом привожу мою командную строку:
195219
196220в компилятор / выполнить:
197221
198-` gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'`
222+```text
223+ gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
224+```
199225
200226~/src/sollib директория которая содержит:
201227
202228- набор файлов .o из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
203229- libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
204230- набор файлов lib*.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
205231
206232Иллюстрация проблемы при компиляции:
207233
208-` Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc`\
209-` Copyright (c) 1993-2005 by Florian Klaempfl`\
210-` Target OS: Solaris for SPARC`\
211-` Compiling system.pp`\
212-` system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found`
234+``` pascal
235+ Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
236+ Copyright (c) 1993-2005 by Florian Klaempfl
237+ Target OS: Solaris for SPARC
238+ Compiling system.pp
239+ system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
240+```
213241
214242Я подозреваю что ошибся с выбранными .o файлами.
215243
216244## Для Mac OS X
217245
218246Посмотрите этот [пост](http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222).
219247
220248## Авторы
221249
222250Эта страница была конвертирована из epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWin32UnderLinux).
223251
224252---
225253*From the Free Pascal wiki, page "Cross compiling for Win32 under Linux/ru", as it stood on 2021-07-20 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
226254Category: Cross compilation/ru
227255Category: FPC/ru
228256Category: Lazarus/ru
229257Category: Russian

Back to history