Sign in Join
Wiki copytemporary

Cross compiling/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Предисловие
22
33Это краткое введение для новичков. В следующих разделах описывается, как настроить систему для кросскомпиляции, что означает создание двоичных файлов (исполняемых файлов) для платформы, отличной от той, которая используется для компиляции, напр., работающих под Linux и создающих исполняемые файлы Win32 (или для FreeBSD или Darwin и т.д.). В этом случае платформу, используемую для компиляции, обычно называют **"хостом"** \[(host)\] (Linux в приведенном выше примере), а платформа, в которой вы хотите запускать созданные двоичные файлы, является вашей **"целью"** \[(target)\]. FreePascal является компилятором и в основном преобразует исходный код в двоичные файлы (машинный язык). Эти двоичные файлы также содержат информацию о том, как операционная система запускает исполняемые файлы. Более того, двоичные файлы относятся к API-интерфейсам, предоставляемым конкретной операционной системой, поэтому для разных операционных систем необходима другая реализация нашей библиотеки времени выполнения. Следовательно, эти двоичные файлы являются специфичными для платформы. Сам FreePascal не нуждается в большой настройке. Он может создавать двоичные файлы для многих платформ. Таким образом, просто прикажите \[компилятору\] сделать это.
44
55## Хост и цель на одном процессоре
66
77FPC разработан таким образом, что распределенный компилятор может создавать машинный код для определенного процессора \[(CPU)\] (поскольку разные процессоры нуждаются в разном компьютерном коде), и он знает конкретные требования для всех поддерживаемых платформ (операционных систем), доступных на этом конкретном процессоре. Это означает, что вы можете выполнять кросс-компиляцию с тем же компилятором, который используется для встроенной компиляции, если вы придерживаетесь одного и того же CPU.
88
99## Хост и цель на разных процессорах
1010
1111Если необходимо создать двоичные файлы для другого процессора, вам нужен специальный кросскомпилятор, то есть компилятор, работающий на платформе хоста, но способный создавать машинный код для другого процессора (в случае FPC такой кросс-компилятор снова можно нацелить на все поддерживаемые платформы, доступные в _target_ CPU). Этот кросс-компилятор обычно сохраняется в том же каталоге, что и собственный компилятор. Такой кросс-компилятор может быть либо скомпилирован вами, либо вы можете использовать готовый распределенный кросс-компилятор, предоставляемый для некоторых платформ непосредственно командой \[разработчиков\] FPC (обычно это платформы, которые в основном используются в портативных устройствах, таких как arm-linux или arm-wince, потому что они обычно не используются в качестве хост-платформ). Затем двоичный файл Fpc может выбрать правильный компилятор (собственный компилятор или кросскомпилятор) для целевого CPU, выбранного с использованием параметра -P.
1212
1313## Ассемблер и компоновщик
1414
1515Компилятор - это только одна часть. Нам также нужен ассемблер и компоновщик. FPC предоставляет внутренний ассемблер и/или компоновщик для некоторых платформ, но для других платформ нужны внешние инструменты. Обычно эти инструменты не могут создавать двоичные файлы для разных платформ. Вот почему мы должны использовать разные специальные компоновщики 'ld' и ассемблер 'as' для каждой целевой платформы. Это \[и есть\] binutils.
1616
1717См. [[Binutils/ru|Binutils]]
1818
1919## Модули, \[необходимые\] для целевой платформы
2020
2121После создания (или наличия/установки) кросс-инструментов требуется FPC RTL и другие модули, скомпилированные для выбранной целевой платформы. Например, каждая целевая платформа нуждается в другом файле system.ppu (модуль System) и т.д. Эти модули могут быть скомпилированы с использованием вашего компилятора, настроенного для компиляции на целевую платформу, или вы можете использовать официально распространяемые модули, скомпилированные (и распространяемые) с точно такой же версией FPC (если она доступна в формате, доступном для конкретной платформы хоста).
2222
2323## Конфигурация
2424
2525Затем будет настроен ваш конфигурационный файл fpc так, что кросс-компиляция станет настолько простой, что вы сможете забыть все скучные детали. То же самое будет сделано для LCL - библиотеки компонентов lazarus (при использовании Lazarus). И после этого вы можете перекрестно скомпилировать программы паскаля для (другой) целевой платформы. Полученные двоичные файлы затем могут быть скопированы на машину с запущенной целевой платформой или запущены под эмулятором (например, в Wine для Win32 двоичные файлы под Linux и т.д.).
2626
2727## Основные шаги
2828
2929Есть несколько общих шагов, связанных с кросс-компиляцией, которые вы должны делать в каждом случае:
3030
3131- Уже иметь компилятор FreePascal для платформы, из которой вы хотите компилировать.
3232- У вас должен быть исходный код FreePascal (за исключением специальных случаев, когда все \[было\] подготовлено кем-то другим).
3333- Вам нужно \[будет\] либо собрать из исходного кода, либо получить двоичные файлы cross-binutils (см. [[Binutils/ru|Binutils]]), которые \[будут\] запускаться на платформе, на которой вы находитесь \[(хост-платформе)\], и \[будут\] предназначены для создания программ для вашей целевой платформы.
3434- Иногда вам \[будут\] нужны некоторые файлы из целевой \[платформы\], \[под\] которую вы компилируете.
3535
3636# Из Linux
3737
3838## Из Linux x64 на Linux i386
3939
4040Скорее всего, ваш 64-разрядный дистрибутив Linux уже способен компилировать 32-битные программы, но из-за того, \[что\] процесс сборки fpc \[так\] разработан, есть несколько вещей, которые вам, возможно, придется сделать.
4141
4242- На мультиархитектурном debian/ubuntu вы должны установить пакет libc6-dev-i386
4343
4444- Сначала проверьте, есть ли у вас файлы i386-linux-ld и i386-linux-as:
4545
4646``` bash
4747$ which i386-linux-ld
4848```
4949
5050``` bash
5151$ which i386-linux-as
5252```
5353
5454Если у вас есть эти файлы, пропустите заголовок "Compile FPC" \[("Компилировать FPC")\]. Оба \[файла\] могут быть созданы с использованием следующего сценария:
5555
5656``` bash
5757#!/bin/bash
5858
5959# Создаем /usr/bin/i386-linux-ld
6060cat >/usr/bin/i386-linux-ld << EOF
6161#!/bin/bash
6262ld -A elf32-i386 \$@
6363EOF
6464chmod +x /usr/bin/i386-linux-ld
6565
6666# Создаем /usr/bin/i386-linux-as
6767cat >/usr/bin/i386-linux-as << EOF
6868#!/bin/bash
6969as --32 \$@
7070EOF
7171chmod +x /usr/bin/i386-linux-as
7272```
7373
7474- Компилируем FPC:
7575
7676``` bash
7777cd /usr/share/fpcsrc/<version>
7878sudo make all CPU_TARGET=i386
7979```
8080
8181затем:
8282
8383``` bash
8484sudo make crossinstall CPU_TARGET=i386
8585```
8686
8787Вот и все. Отредактируйте ваш файл /etc/fpc.cfg при необходимости. Обратите внимание, что, по крайней мере, \[начиная с версии fpc\] 3.0.4, выше упомянутая кроссинсталляция помещает файлы в /usr/local/lib/fpc/3.0.4/units/i386-linux и оставшуюся часть системы fpc помещается в /usr/lib/... \[Это\] легко фиксируется символической ссылкой, но гораздо приятнее сделать так:
8888
8989``` bash
9090sudo make crossinstall CPU_TARGET=i386 INSTALL_PREFIX=/usr
9191```
9292
9393Обратите внимание: если вы видите сообщения о том, что не удалось найти файлы, такие как crtn.o, и о прогнозируемых сбоях линковки, это \[происходит\], вероятно, потому, что ваш дистрибутив Linux любит хранить свои 32-битные библиотеки gcc в /usr/lib32. Проверьте, если недостающие файлы и в самом деле \[находятся\] в /usr/lib32, сделайте небольшое изменение в вашем \[конфигурационном\] файле /etc/fpc.cfg, напр., в строке \#177 есть раздел, который выглядит следующим образом:
9494
9595``` bash
9696#ifdef cpui386
9797-Fl/usr/lib/gcc/x86_64-linux-gnu/6/32
9898#endif
9999```
100100
101101Сделайте это так, \[добавьте\] еще одну строку:
102102
103103``` bash
104104#ifdef cpui386
105105-Fl/usr/lib/gcc/x86_64-linux-gnu/6/32
106106-Fl/usr/lib32
107107#endif
108108```
109109
110110## Из Linux на ARM Linux
111111
112112Сведения о таргетинге на Linux, запущенном на ARM (напр., Zaurus), можно найти в [[Setup Cross Compile For ARM/ru|Setup Cross Compile For ARM]].
113113
114114## Из Linux на Windows
115115
116116Информацию о кросс-компиляции с Lazarus можно найти в [[Cross compiling for Windows under Linux/ru|Cross compiling for Windows under Linux]]
117117
118118## Из Linux на Darwin или macOS
119119
120120Пожалуйста, см. [[Cross compiling OSX on Linux]].
121121
122122# Из Windows
123123
124124## Из Windows на Linux
125125
126126Это менее тривиально \[, чем на Linux'е\], есть некоторая информация в [[buildfaq/ru|buildfaq]]
127127
128128См. также [[fpcup]] для описания работы binutils и того, какие библиотеки/файлы нужно копировать.
129129
130130------------------------------------------------------------------------
131131
132132Прим.перев.: Вместо fpcup я бы настоятельно рекомендовал использовать ее более продвинутый форк [fpcupdeluxe](https://github.com/newpascal/fpcupdeluxe/releases).\
133133Русскоязычной аудитории, возможно, будет интересен некоторый мой собственный опыт его использования [тут](http://leybabronstain.ucoz.com/blog/ispolzovanie_krosskompiljacii_v_lazarus/2018-03-03-24). И я не буду возражать, если кто-то, сочтя это за рекламу, удалит ссылку на блог :Р''.
134134
135135------------------------------------------------------------------------
136136
137137Как объясняется в FAQ по сборке, вам понадобятся файлы библиотеки (.so-файлы) из целевой системы, напр., из /lib и /user/lib (но может быть больше мест). В некоторых системах некоторые .so-файлы на самом деле являются скриптами; проверьте \[это командой\]
138138
139139```dos
140140grep -i "ld script" *
141141```
142142
143143Удалите эти .so-файлы и скопируйте поверх .so.x-файлы (или симлинки), которые вам нужно использовать, чтобы компоновщик их нашел.
144144
145145## Из Windows на GO32v2
146146
147147Подробная информация может быть найдена в [[Cross-compilation from Win32 to GO32v2]].
148148
149149## Из Windows на wince
150150
151151[[arm-wince]] описывает, как настроить кросс-компилятор для arm CPU\
152152[[i386-wince]] описывает, как настроить компиляцию для i386 CPU (без кросскомпиляции)\
153153
154154> **Note:** У инсталлятора Lazarus есть установщик, который автоматически добавляет Windows к настройкам кросскомпиляции Wince
155155
156156## Из win32 на win64
157157
158158Если вы компилируете ветку fpc 2.1.1 или старше, вы можете просто сделать:
159159
160160``` bash
161161$ make all OS_TARGET=win64 CPU_TARGET=x86_64
162162```
163163
164164и затем
165165
166166``` bash
167167$ make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64
168168```
169169
170170## Из win64 на win32
171171
172172Установите lazarus-1.6.0-fpc-3.0.0-cross-i386-win32-win64.exe, затем настройте параметры проекта \[таким образом\], чтобы \[стало\]:
173173
174174- Target OS : Win32
175175- Target CPU : i386
176176
177177Неправильная установка CPU (по умолчанию) приведет к неправильной платформе win32-x86_64!
178178
179179# Из Darwin (macOS)
180180
181181## Из Darwin i386 на powerpc
182182
183183Официальный установщик FPC для macOS/i386 включает в себя кросс-компилятор PowerPC и все модули, необходимые для компиляции программ PowerPC (используйте "ppcppc" вместо "ppc386" для компиляции ваших программ). Приведенные ниже инструкции необходимы только в том случае, если вы хотите скомпилировать и установить новую версию из svn.
184184
185185- Компилируем FPC:
186186
187187``` bash
188188$ cd fpc
189189$ make all CPU_TARGET=powerpc -j 2
190190```
191191
192192Это создаст компилятор powerpc cross-compiler (fpc/compiler/ppcrosspcc) и все модули. Вы можете установить их, используя следующие команды:
193193
194194``` bash
195195$ sudo make FPC=`pwd`/compiler/ppc386 install CPU_TARGET=powerpc CROSSINSTALL=1
196196$ INSTALLED_VERSION=`./compiler/ppc386 -iV`
197197$ sudo mv /usr/local/lib/fpc/$INSTALLED_VERSION/ppcrossppc /usr/local/lib/fpc/$INSTALLED_VERSION/ppcppc
198198```
199199
200200Памятка: универсальные двоичные файлы создаются из отдельных (i386 и powerpc) двоичных файлов с использованием \[команды\] lipo.
201201
202202## Из Darwin i386 на x86_64
203203
204204Официальный установщик FPC для macOS/i386 включает компилятор x86_64 и все модули, необходимые для компиляции программ x86_64 (используйте *ppcx64* вместо *ppc386* для компиляции ваших программ или использования fpc -Px86_64). Приведенные ниже инструкции необходимы только в том случае, если вы хотите скомпилировать и установить новую версию из svn.
205205
206206- Компилируем FPC:
207207
208208``` bash
209209$ cd fpc
210210$ make all CPU_TARGET=x86_64
211211```
212212
213213Этот \[код\] создает кросс-компилятор x86_64 (fpc/compiler/ppcrossx64) и все модули. Вы можете установить их, используя следующие команды:
214214
215215``` bash
216216$ sudo make crossinstall CPU_TARGET=x86_64
217217$ sudo mv /usr/local/lib/fpc/2.7.1/ppcrossx64 /usr/local/lib/fpc/2.7.1/ppcx64
218218```
219219
220220Если вы хотите сделать этот недавно установленный компилятор версией по умолчанию (это ***не*** рекомендуется, т.к. это нарушит вашу способность создавать новые версии FPC 2.7.1 без явного указания пути к последнему официальному FPC), также выполните следующую команду:
221221
222222``` bash
223223$ sudo ln -sf /usr/local/lib/fpc/2.7.1/ppcx64 /usr/local/bin/ppcx64
224224```
225225
226226Предполагая, что все компоненты LCL, используемые вашим проектом, поддерживаются с помощью [Cocoa widgetset](http://wiki.lazarus.freepascal.org/Roadmap#Status_of_features_on_each_LCL_Interface), вы можете скомпилировать проект Lazarus из командной строки, используя такую команду (возможно необходим полный путь к компилятору):
227227
228228``` bash
229229$ lazbuild -B project1.lpr --ws=cocoa --cpu=x86_64 --os=darwin --compiler=/usr/local/bin/ppcx64
230230```
231231
232232Вы можете проверить, что ваш исполняемый файл является 64-битным, использует команду "file":
233233
234234``` bash
235235$ file ./project1
236236$ ./project1: Mach-O 64-bit executable x86_64
237237```
238238
239239Кроме того, вы можете настроить свой проект на компиляцию как 64-бит с помощью графического интерфейса Lazarus:
240240
241-`a.) Выберите пункт меню Project/ProjectOptions`\
242-`b.) В [пункте] CompilerOptions/ConfigAndTarget установите "Target CPU family" в "x86_64"`\
243-`c.) В [пункте] CompilerOptions/AdditionsAndOverrides сохраните "LCLWidgetType := cocoa" в LPI`
241+``` pascal
242+a.) Выберите пункт меню Project/ProjectOptions
243+b.) В [пункте] CompilerOptions/ConfigAndTarget установите "Target CPU family" в "x86_64"
244+c.) В [пункте] CompilerOptions/AdditionsAndOverrides сохраните "LCLWidgetType := cocoa" в LPI
245+```
244246
245247Обратите внимание, что 64-разрядный компьютер macOS может работать с 32-разрядными исполняемыми файлами. Однако, если вы хотите создать бинарник, который выполняется на 32-разрядном Intel также хорошо, как и в 64-битном режиме на 64-битном компьютере Intel, вы можете использовать команду "lipo". Это позволило бы 64-разрядному компьютеру получить доступ к большему количеству памяти и теоретически возможно немного улучшиться (например, различные оптимизации компилятора, больше регистров, но с большими указателями). Предполагается, что вы создали отдельные 32-разрядные ("project32") и 64-разрядные ("project64") исполняемые файлы на Lazarus.
246248
247249``` bash
248250$ lipo -create project32 project64 -o projectUniversal
249251```
250252
251253## Из Darwin x86_64 на i386
252254
253255Как и выше, \[только вместо\] **CPU_TARGET** используйте **CPU_SOURCE** .
254256
255257## Из Darwin на Windows, Linux и другие \[OC\]
256258
257259В пакете fpc менеджера пакетов [fink](http://finkproject.org/) имеется 64-разрядный компилятор. Кроме того, \[там\] есть список пакетов для кросскомпиляции на windows, linux, freebsd на разных процессорах.
258260
259261Примеры установки кросскомпилятора:
260262
261263``` bash
262264$ fink install fpc-cross-i386-win32
263265```
264266
265267или
266268
267269``` bash
268270$ fink install fpc-cross-arm-linux
269271```
270272
271273Для компиляции используйте эти команды:
272274
273275``` bash
274276fpc -Pi386 -Twin32 FILENAME
275277fpc -Parm -Tlinux FILENAME
276278```
277279
278280Эта команда дает список кросскомпиляторов:
279281
280282``` bash
281283$ fink list fpc-cross
282284```
283285
284286Текущий (fpc 3.0.4) выдает \[следующий список\]:
285287
286288``` bash
287289fpc-cross-arm-gba
288290fpc-cross-arm-linux
289291fpc-cross-arm-nds
290292fpc-cross-arm-wince
291293fpc-cross-arm-armv4t-embedded
292294fpc-cross-arm-armv7m-embedded
293295fpc-cross-i386-darwin
294296fpc-cross-i386-freebsd
295297fpc-cross-i386-go32v2
296298fpc-cross-i386-linux
297299fpc-cross-i386-nativent
298300fpc-cross-i386-netbsd
299301fpc-cross-i386-solaris
300302fpc-cross-i386-win32
301303fpc-cross-i386-wince
302304fpc-cross-jvm-android
303305fpc-cross-jvm-java
304306fpc-cross-m68k-linux
305307fpc-cross-mipsel-linux
306308fpc-cross-powerpc-linux
307309fpc-cross-sparc-linux
308310fpc-cross-x86-64-dragonfly
309311fpc-cross-x86-64-freebsd
310312fpc-cross-x86-64-linux
311313fpc-cross-x86-64-win64
312314```
313315
314316Для других платформ (процессоров и систем) вы должны самостоятельно выполнить настройку. Это в основном та же схема: во-первых, вам нужны соответствующие binutils (см. [[Binutils/ru|Binutils]]), а во-вторых, кросскомпилятор и библиотека времени выполнения. Более подробную информацию о процедуре сборки можно узнать из файлов описания пакетов кросскомпилятора [fink](http://finkproject.org/) выше.
315317
316318# Из FreeBSD
317319
318320## Из FreeBSD на SPARC
319321
320322> **Warning:** Этот раздел, существует примерно с 2005 года и, вероятно, может быть неактуальным. Обновления приветствуются.
321323
322324Я управился с компилятором из x86 на Sparc Solaris 9. Однако результат \[оказался\] не совсем удовлетворительный, и вот моя строка cmd:
323325
324326в компиляторе/ выполняется:
325327
326328``` bash
327329gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
328330```
329331
330332~/src/sollib это каталог, содержащий:
331333
332334- набор .o's из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
333335- libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
334336- набор библиотек *.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
335337
336338Проблема иллюстрируется следующим двоичным кодом.
337339
338-` Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc`\
339-` Copyright (c) 1993-2005 by Florian Klaempfl`\
340-` Target OS: Solaris for SPARC`\
341-` Compiling system.pp`\
342-` system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found`
340+``` pascal
341+ Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
342+ Copyright (c) 1993-2005 by Florian Klaempfl
343+ Target OS: Solaris for SPARC
344+ Compiling system.pp
345+ system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
346+```
343347
344348I suspect wrong .o's are taken. Я подозреваю, что взяты неправильные .o-файлы.
345349
346350# Из контейнера Docker
347351
348352Кросскомпиляция "hello world" с \[использованием\] образа Docker и Free Pascal Compiler 3.0.4
349353
3503541\. извлекаем образ docker:
351355
352356``` bash
353357sudo docker pull taraworks/lazarus-cross:0.0.2 #(do not use latest)
354358```
355359
3563602\. создаем контейнер с виртуальным томом на основе извлеченного образа:
357361
358362a\. идентифицируем ID образа (необходимы первые 4 цифры):
359363
360364``` bash
361365sudo docker images
362366```
363367
364368b\. используем образ для контейнера, маппируем виртуальный том из хоста:
365369
366370``` bash
367371sudo docker create --name pascalContainer -v /home/tudi/pascal_files:/home/tudi/pascal_files -ti image ID
368372```
369373
3703743\. запускаем контейнер
371375
372376a\. идентифицируем ID контейнера (необходимы первые 4 цифры):
373377
374378``` bash
375379sudo docker ps -a
376380```
377381
378382b\. запускаем контейнер:
379383
380384``` bash
381385sudo docker start container ID
382386```
383387
3843884\. компилируем файл
385389
386390a\. копируем паскаль-файл hello.pas из <https://github.com/taraworks/lazarus-cross> в папку /home/tudi/pascal_files на хосте:
387391
388392запускаем на хосте:
389393
390394``` bash
391395cd /home/tudi/pascal_files
392396
393397git clone https://github.com/taraworks/lazarus-cross.git
394398```
395399
396400b\. прикрепляем к контейнеру для проверки клонированного репо:
397401
398402запускаем на хосте:
399403
400404``` bash
401405sudo docker attach container ID
402406```
403407
404408press enter one more time and check hello.pas is in container folder. do not detach with exit from container as container will stop. нажимаем "enter" еще раз и проверяем, что hello.pas находится в папке с контейнером. не отсоединяйте с выходом из контейнера, пока контейнер остановится.
405409
406410c\. компилируем из контейнер; меняем каталог до папки, содержащей hello.pas:
407411
408412для Windows:
409413
410414``` bash
411415PATH=$PATH:/opt/clang/bin:/opt/osxcross/target/bin /opt/windows/lib/fpc/3.0.4/ppcross386 -Twin32 -va hello.pas
412416```
413417
414418для OSX:
415419
416420``` bash
417421PATH=$PATH:/opt/clang/bin:/opt/osxcross/target/bin /opt/darwin/lib/fpc/3.0.4/ppcross386 -Tdarwin -XR/opt/osxcross/target/SDK/MacOSX10.11.sdk -va hello.pas
418422```
419423
420424d\. компилируем из хоста
421425
422426``` bash
423427sudo docker exec pascalContainer bash -c "cd ${CI_PROJECT_DIR} && PATH=$PATH:/opt/clang/bin:/opt/osxcross/target/bin /opt/windows/lib/fpc/3.0.4/ppcross386 -Twin32 -va /home/tudi/pascal_files/lazarus-cross/hello.pas"
424428```
425429
426430# Общие примечания к Unix/Linux
427431
428432Опция -XLA используется для переименования зависимостей библиотек, указанных в модулях паскаля. Формат -XLAold=new, чтобы изменить параметр ld link -l\<old\> на -l\<new\>.
429433
430434Опция -XR\<sysroot\> (недавний trunk) может использоваться для указания системного root целевой \[платформы\]. Он используется для:
431435
432436- добавления префикса к путям добавленной библиотеки по умолчанию; в прошлом вы указывали -Xd и эти пути вручную. Напр., для i386-linux вместо передачи /lib, /usr/lib и /usr/X11R6/lib в ld, он будет передан \<sysroot\>/lib, \<sysroot\>/usr/lib и \<sysroot\>/usr/X11R6/lib в ld.
433437- обнаружения библиотеки C (специфической для Linux): glibc или uclibc. Напр., для попытки обнаружения uclibc '\<sysroot\>/lib/ld-uClibc.so.0'.
434438
435439# Кросскомпиляция LCL
436440
437441Начиная с \[версии\] 0.9.31, LCL является обычным пакетом Lazarus, и среда IDE автоматически \[сделает\] кросскомпиляцию всех необходимых пакетов при изменении целевой платформы вашего проекта.
438442
439443Если что-то пойдет не так, то вот несколько советов, которые могли бы помочь выяснить, в чем причина:
440444
441445## Тест кросскомпилятора
442446
443447Проверьте, правильно ли установлен кросскомпилированный fpc:
444448
445449Создайте программу \[в духе\] "hello world" в test.pas:
446450
447451``` pascal
448452program test;
449453begin
450454 writeln('DATE ',{$i %DATE%});
451455 writeln('FPCTARGET ',{$i %FPCTARGET%});
452456 writeln('FPCTARGETCPU ',{$i %FPCTARGETCPU%});
453457 writeln('FPCTARGETOS ',{$i %FPCTARGETOS%});
454458 writeln('FPCVERSION ',{$i %FPCVERSION%});
455459end.
456460```
457461
458462И скомпилируйте его с исходной/оригинальной платформой. Пример для x86 Windows:
459463
460464``` bash
461465fpc -Twin32 -Pi386 test.pas
462466```
463467
464468Затем проверьте исходный компилятор:
465469
466470``` bash
467471test
468472```
469473
470474Замените *win32* и *i386* своими целями \[(имеется ввиду, "своими" ОС и CPU)\]. Пример для целевой Windows 64 бит:
471475
472476``` bash
473477fpc -Twin64 -Px86_64 test.pas
474478```
475479
476480Затем проверьте кросскомпилятор:
477481
478482``` bash
479483test
480484```
481485
482486Программа **fpc** представляет собой оболочку, которая ищет правильный компилятор (напр., ppcrossx64) для цели и выполняет его.
483487
484488If this does not work, your cross compiler was not installed correctly. When this works you can cross compile the LCL. Если это не сработает, ваш кросскомпилятор был установлен неправильно. Когда это работает, вы можете \[выполнять\] кросскомпиляцию \[посредством\] LCL.
485489
486490## Кросскомпиляция LCL в Lazarus 0.9.30 и ниже
487491
488492Если вы уверены, что ваш кросскомпилятор работает, вы можете выполнить настоящую кросскомпиляцию.
489493
490494Выполните следующие шаги в IDE Lazarus, чтобы выполнить кросскомпиляцию LCL:
491495
492496В более старых IDE:
493497
494498- Определите в *Tools -\> Options -\> Environment -\> Files* \[ в строке\] *Compiler path* путь к *fpc*. Обычно это уже сделано.
495499- Затем откройте *Tools -\> Configure Build Lazarus*.
496500- Установите *Target OS* (напр., в *Win64*) и *Target CPU* (напр., в *x86_64*)
497501- Нажмите кнопку *Build*.
498502
499503### Командная строка
500504
501505Помимо IDE, командная строка также позволяет создавать кросскомпилер LCL.
502506
503507> **Note:** Начиная с \[версии Lazarus\] 0.9.31, вы должны использовать утилиту `lazbuild` для кросскомпиляции пакетов Lazarus. См. `Lazbuild -h` для \[получения\] списка опций.
504508
505509Пример: вы желаете скомпилировать Windows 64, используя кросскомпилятор: сначала тщательно очистите 64-битные остатки \[пакетов\]. Это не касается вашей 32-битной среды:
506510
507511``` bash
508512make distclean LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
509513```
510514
511515Затем соберите LCL и необходимые ей зависимости. Нами используется LCL_PLATFORM, поскольку он, по-видимому, по-прежнему является Windows 32 даже в Windows 64 (виджеты одинаковы).
512516
513517``` bash
514518make packager/registration lazutils lcl LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
515519```
516520
517521Как и в предыдущем разделе, LCL для вашей нормальной ОС не затрагивается.
518522
519523# Кросскомпиляция приложений LCL
520524
521525Сначала вам нужно скомпилировать LCL. См. выше.
522526
523527Кросскомпиляция приложений означает: компиляция + связывание. Когда вы \[сделали\] кросскомпиляцию LCL, компиляционная часть \[остального\] проста. Просто установите в параметрах компилятора IDE целевую ОС и целевой CPU. Трудная часть - это связывание. Если вы \[сделаете\] кросскомпиляцию проекта, вы можете увидеть что-то вроде этого:
524528
525-`/usr/local/bin/arm-linux-ld: cannot find -lX11`
529+```text
530+/usr/local/bin/arm-linux-ld: cannot find -lX11
531+```
526532
527533Это означает, что вам необходимо установить графические библиотеки целевой системы. Это не имеет ничего общего с FPC/Lazarus, но \[связано\] с библиотеками кросскомпиляции. Некоторые дистрибутивы предоставляют для этого предварительно скомпилированные пакеты. Например, Microsoft предоставляет кросскомпилированные библиотеки WinCE для Windows. В Linux вы можете установить Wine для кросскомпиляции из Linux на Windows. Некоторые дистрибутивы Linux предоставляют 64-битные библиотеки для 32-битных систем.
528534
529535# FAQ по кросскомпиляции
530536
531537## Почему кросскомпиляция?
532538
533539Так вы можете разработать программу для одной ОС/CPU и скомпилировать ее для другой ОС/CPU без перезагрузки или переключения компьютеров.
534540
535541## Почему без кросскомпиляции?
536542
537543Во многих случаях вы хотите протестировать полученную программу на собственной платформе. Компиляция приложения на этой платформе может быть проще в настройке.
538544
539545## Почему \[предпочтительнее\] кросскомпиляция из Unix на Windows, а не наоборот?
540546
541547См. [[Cross compiling for Windows under Linux/ru|Cross compiling for Win32 under Linux]]
542548
543549## Я хочу получить дополнительную информацию о сборках на Freepascal. Где это?
544550
545551Существует общий FAQ в формате pdf о том, как создавать и настраивать FPC: [[buildfaq]]
546552
547553## Ошибки, такие как компилятор "/usr/bin/fpc", не поддерживает целевой arm-linux
548554
549555Помимо других причин, эта ошибка может возникнуть, если вы отредактировали fpc.cfg с неправильными параметрами для кросскомпилятора (напр., указав все параметры в одну строку вместо одной через строку).
550556
551557# См. также
552558
553559- [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt) Заметки о кросскомпиляции
554560- [[Cross compiling for Windows under Linux]]
555561- [GetLazarus - Сделай сам](http://web.archive.org/web/20160927181920/http://www.getlazarus.org/setup/making/) (Сохраненная копия от 27.09.2016)
556562
557563---
558564*From the Free Pascal wiki, page "Cross compiling/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).*

Back to history