Sign in Join
Wiki copytemporary

Cross compiling/ru: what changed

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

Title: Cross compiling/ru

OldNewLine
1+## Предисловие
2+
3+Это краткое введение для новичков. В следующих разделах описывается, как настроить систему для кросскомпиляции, что означает создание двоичных файлов (исполняемых файлов) для платформы, отличной от той, которая используется для компиляции, напр., работающих под Linux и создающих исполняемые файлы Win32 (или для FreeBSD или Darwin и т.д.). В этом случае платформу, используемую для компиляции, обычно называют **"хостом"** \[(host)\] (Linux в приведенном выше примере), а платформа, в которой вы хотите запускать созданные двоичные файлы, является вашей **"целью"** \[(target)\]. FreePascal является компилятором и в основном преобразует исходный код в двоичные файлы (машинный язык). Эти двоичные файлы также содержат информацию о том, как операционная система запускает исполняемые файлы. Более того, двоичные файлы относятся к API-интерфейсам, предоставляемым конкретной операционной системой, поэтому для разных операционных систем необходима другая реализация нашей библиотеки времени выполнения. Следовательно, эти двоичные файлы являются специфичными для платформы. Сам FreePascal не нуждается в большой настройке. Он может создавать двоичные файлы для многих платформ. Таким образом, просто прикажите \[компилятору\] сделать это.
4+
5+## Хост и цель на одном процессоре
6+
7+FPC разработан таким образом, что распределенный компилятор может создавать машинный код для определенного процессора \[(CPU)\] (поскольку разные процессоры нуждаются в разном компьютерном коде), и он знает конкретные требования для всех поддерживаемых платформ (операционных систем), доступных на этом конкретном процессоре. Это означает, что вы можете выполнять кросс-компиляцию с тем же компилятором, который используется для встроенной компиляции, если вы придерживаетесь одного и того же CPU.
8+
9+## Хост и цель на разных процессорах
10+
11+Если необходимо создать двоичные файлы для другого процессора, вам нужен специальный кросскомпилятор, то есть компилятор, работающий на платформе хоста, но способный создавать машинный код для другого процессора (в случае FPC такой кросс-компилятор снова можно нацелить на все поддерживаемые платформы, доступные в _target_ CPU). Этот кросс-компилятор обычно сохраняется в том же каталоге, что и собственный компилятор. Такой кросс-компилятор может быть либо скомпилирован вами, либо вы можете использовать готовый распределенный кросс-компилятор, предоставляемый для некоторых платформ непосредственно командой \[разработчиков\] FPC (обычно это платформы, которые в основном используются в портативных устройствах, таких как arm-linux или arm-wince, потому что они обычно не используются в качестве хост-платформ). Затем двоичный файл Fpc может выбрать правильный компилятор (собственный компилятор или кросскомпилятор) для целевого CPU, выбранного с использованием параметра -P.
12+
13+## Ассемблер и компоновщик
14+
15+Компилятор - это только одна часть. Нам также нужен ассемблер и компоновщик. FPC предоставляет внутренний ассемблер и/или компоновщик для некоторых платформ, но для других платформ нужны внешние инструменты. Обычно эти инструменты не могут создавать двоичные файлы для разных платформ. Вот почему мы должны использовать разные специальные компоновщики 'ld' и ассемблер 'as' для каждой целевой платформы. Это \[и есть\] binutils.
16+
17+См. [[Binutils/ru|Binutils]]
18+
19+## Модули, \[необходимые\] для целевой платформы
20+
21+После создания (или наличия/установки) кросс-инструментов требуется FPC RTL и другие модули, скомпилированные для выбранной целевой платформы. Например, каждая целевая платформа нуждается в другом файле system.ppu (модуль System) и т.д. Эти модули могут быть скомпилированы с использованием вашего компилятора, настроенного для компиляции на целевую платформу, или вы можете использовать официально распространяемые модули, скомпилированные (и распространяемые) с точно такой же версией FPC (если она доступна в формате, доступном для конкретной платформы хоста).
22+
23+## Конфигурация
24+
25+Затем будет настроен ваш конфигурационный файл fpc так, что кросс-компиляция станет настолько простой, что вы сможете забыть все скучные детали. То же самое будет сделано для LCL - библиотеки компонентов lazarus (при использовании Lazarus). И после этого вы можете перекрестно скомпилировать программы паскаля для (другой) целевой платформы. Полученные двоичные файлы затем могут быть скопированы на машину с запущенной целевой платформой или запущены под эмулятором (например, в Wine для Win32 двоичные файлы под Linux и т.д.).
26+
27+## Основные шаги
28+
29+Есть несколько общих шагов, связанных с кросс-компиляцией, которые вы должны делать в каждом случае:
30+
31+- Уже иметь компилятор FreePascal для платформы, из которой вы хотите компилировать.
32+- У вас должен быть исходный код FreePascal (за исключением специальных случаев, когда все \[было\] подготовлено кем-то другим).
33+- Вам нужно \[будет\] либо собрать из исходного кода, либо получить двоичные файлы cross-binutils (см. [[Binutils/ru|Binutils]]), которые \[будут\] запускаться на платформе, на которой вы находитесь \[(хост-платформе)\], и \[будут\] предназначены для создания программ для вашей целевой платформы.
34+- Иногда вам \[будут\] нужны некоторые файлы из целевой \[платформы\], \[под\] которую вы компилируете.
35+
36+# Из Linux
37+
38+## Из Linux x64 на Linux i386
39+
40+Скорее всего, ваш 64-разрядный дистрибутив Linux уже способен компилировать 32-битные программы, но из-за того, \[что\] процесс сборки fpc \[так\] разработан, есть несколько вещей, которые вам, возможно, придется сделать.
41+
42+- На мультиархитектурном debian/ubuntu вы должны установить пакет libc6-dev-i386
43+
44+- Сначала проверьте, есть ли у вас файлы i386-linux-ld и i386-linux-as:
45+
46+``` bash
47+$ which i386-linux-ld
48+```
49+
50+``` bash
51+$ which i386-linux-as
52+```
53+
54+Если у вас есть эти файлы, пропустите заголовок "Compile FPC" \[("Компилировать FPC")\]. Оба \[файла\] могут быть созданы с использованием следующего сценария:
55+
56+``` bash
57+#!/bin/bash
58+
59+# Создаем /usr/bin/i386-linux-ld
60+cat >/usr/bin/i386-linux-ld << EOF
61+#!/bin/bash
62+ld -A elf32-i386 \$@
63+EOF
64+chmod +x /usr/bin/i386-linux-ld
65+
66+# Создаем /usr/bin/i386-linux-as
67+cat >/usr/bin/i386-linux-as << EOF
68+#!/bin/bash
69+as --32 \$@
70+EOF
71+chmod +x /usr/bin/i386-linux-as
72+```
73+
74+- Компилируем FPC:
75+
76+``` bash
77+cd /usr/share/fpcsrc/<version>
78+sudo make all CPU_TARGET=i386
79+```
80+
81+затем:
82+
83+``` bash
84+sudo make crossinstall CPU_TARGET=i386
85+```
86+
87+Вот и все. Отредактируйте ваш файл /etc/fpc.cfg при необходимости. Обратите внимание, что, по крайней мере, \[начиная с версии fpc\] 3.0.4, выше упомянутая кроссинсталляция помещает файлы в /usr/local/lib/fpc/3.0.4/units/i386-linux и оставшуюся часть системы fpc помещается в /usr/lib/... \[Это\] легко фиксируется символической ссылкой, но гораздо приятнее сделать так:
88+
89+``` bash
90+sudo make crossinstall CPU_TARGET=i386 INSTALL_PREFIX=/usr
91+```
92+
93+Обратите внимание: если вы видите сообщения о том, что не удалось найти файлы, такие как crtn.o, и о прогнозируемых сбоях линковки, это \[происходит\], вероятно, потому, что ваш дистрибутив Linux любит хранить свои 32-битные библиотеки gcc в /usr/lib32. Проверьте, если недостающие файлы и в самом деле \[находятся\] в /usr/lib32, сделайте небольшое изменение в вашем \[конфигурационном\] файле /etc/fpc.cfg, напр., в строке \#177 есть раздел, который выглядит следующим образом:
94+
95+``` bash
96+#ifdef cpui386
97+-Fl/usr/lib/gcc/x86_64-linux-gnu/6/32
98+#endif
99+```
100+
101+Сделайте это так, \[добавьте\] еще одну строку:
102+
103+``` bash
104+#ifdef cpui386
105+-Fl/usr/lib/gcc/x86_64-linux-gnu/6/32
106+-Fl/usr/lib32
107+#endif
108+```
109+
110+## Из Linux на ARM Linux
111+
112+Сведения о таргетинге на Linux, запущенном на ARM (напр., Zaurus), можно найти в [[Setup Cross Compile For ARM/ru|Setup Cross Compile For ARM]].
113+
114+## Из Linux на Windows
115+
116+Информацию о кросс-компиляции с Lazarus можно найти в [[Cross compiling for Windows under Linux/ru|Cross compiling for Windows under Linux]]
117+
118+## Из Linux на Darwin или macOS
119+
120+Пожалуйста, см. [[Cross compiling OSX on Linux]].
121+
122+# Из Windows
123+
124+## Из Windows на Linux
125+
126+Это менее тривиально \[, чем на Linux'е\], есть некоторая информация в [[buildfaq/ru|buildfaq]]
127+
128+См. также [[fpcup]] для описания работы binutils и того, какие библиотеки/файлы нужно копировать.
129+
130+------------------------------------------------------------------------
131+
132+Прим.перев.: Вместо fpcup я бы настоятельно рекомендовал использовать ее более продвинутый форк [fpcupdeluxe](https://github.com/newpascal/fpcupdeluxe/releases).\
133+Русскоязычной аудитории, возможно, будет интересен некоторый мой собственный опыт его использования [тут](http://leybabronstain.ucoz.com/blog/ispolzovanie_krosskompiljacii_v_lazarus/2018-03-03-24). И я не буду возражать, если кто-то, сочтя это за рекламу, удалит ссылку на блог :Р''.
134+
135+------------------------------------------------------------------------
136+
137+Как объясняется в FAQ по сборке, вам понадобятся файлы библиотеки (.so-файлы) из целевой системы, напр., из /lib и /user/lib (но может быть больше мест). В некоторых системах некоторые .so-файлы на самом деле являются скриптами; проверьте \[это командой\]
138+
139+```dos
140+grep -i "ld script" *
141+```
142+
143+Удалите эти .so-файлы и скопируйте поверх .so.x-файлы (или симлинки), которые вам нужно использовать, чтобы компоновщик их нашел.
144+
145+## Из Windows на GO32v2
146+
147+Подробная информация может быть найдена в [[Cross-compilation from Win32 to GO32v2]].
148+
149+## Из Windows на wince
150+
151+[[arm-wince]] описывает, как настроить кросс-компилятор для arm CPU\
152+[[i386-wince]] описывает, как настроить компиляцию для i386 CPU (без кросскомпиляции)\
153+
154+> **Note:** У инсталлятора Lazarus есть установщик, который автоматически добавляет Windows к настройкам кросскомпиляции Wince
155+
156+## Из win32 на win64
157+
158+Если вы компилируете ветку fpc 2.1.1 или старше, вы можете просто сделать:
159+
160+``` bash
161+$ make all OS_TARGET=win64 CPU_TARGET=x86_64
162+```
163+
164+и затем
165+
166+``` bash
167+$ make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64
168+```
169+
170+## Из win64 на win32
171+
172+Установите lazarus-1.6.0-fpc-3.0.0-cross-i386-win32-win64.exe, затем настройте параметры проекта \[таким образом\], чтобы \[стало\]:
173+
174+- Target OS : Win32
175+- Target CPU : i386
176+
177+Неправильная установка CPU (по умолчанию) приведет к неправильной платформе win32-x86_64!
178+
179+# Из Darwin (macOS)
180+
181+## Из Darwin i386 на powerpc
182+
183+Официальный установщик FPC для macOS/i386 включает в себя кросс-компилятор PowerPC и все модули, необходимые для компиляции программ PowerPC (используйте "ppcppc" вместо "ppc386" для компиляции ваших программ). Приведенные ниже инструкции необходимы только в том случае, если вы хотите скомпилировать и установить новую версию из svn.
184+
185+- Компилируем FPC:
186+
187+``` bash
188+$ cd fpc
189+$ make all CPU_TARGET=powerpc -j 2
190+```
191+
192+Это создаст компилятор powerpc cross-compiler (fpc/compiler/ppcrosspcc) и все модули. Вы можете установить их, используя следующие команды:
193+
194+``` bash
195+$ sudo make FPC=`pwd`/compiler/ppc386 install CPU_TARGET=powerpc CROSSINSTALL=1
196+$ INSTALLED_VERSION=`./compiler/ppc386 -iV`
197+$ sudo mv /usr/local/lib/fpc/$INSTALLED_VERSION/ppcrossppc /usr/local/lib/fpc/$INSTALLED_VERSION/ppcppc
198+```
199+
200+Памятка: универсальные двоичные файлы создаются из отдельных (i386 и powerpc) двоичных файлов с использованием \[команды\] lipo.
201+
202+## Из Darwin i386 на x86_64
203+
204+Официальный установщик FPC для macOS/i386 включает компилятор x86_64 и все модули, необходимые для компиляции программ x86_64 (используйте *ppcx64* вместо *ppc386* для компиляции ваших программ или использования fpc -Px86_64). Приведенные ниже инструкции необходимы только в том случае, если вы хотите скомпилировать и установить новую версию из svn.
205+
206+- Компилируем FPC:
207+
208+``` bash
209+$ cd fpc
210+$ make all CPU_TARGET=x86_64
211+```
212+
213+Этот \[код\] создает кросс-компилятор x86_64 (fpc/compiler/ppcrossx64) и все модули. Вы можете установить их, используя следующие команды:
214+
215+``` bash
216+$ sudo make crossinstall CPU_TARGET=x86_64
217+$ sudo mv /usr/local/lib/fpc/2.7.1/ppcrossx64 /usr/local/lib/fpc/2.7.1/ppcx64
218+```
219+
220+Если вы хотите сделать этот недавно установленный компилятор версией по умолчанию (это ***не*** рекомендуется, т.к. это нарушит вашу способность создавать новые версии FPC 2.7.1 без явного указания пути к последнему официальному FPC), также выполните следующую команду:
221+
222+``` bash
223+$ sudo ln -sf /usr/local/lib/fpc/2.7.1/ppcx64 /usr/local/bin/ppcx64
224+```
225+
226+Предполагая, что все компоненты LCL, используемые вашим проектом, поддерживаются с помощью [Cocoa widgetset](http://wiki.lazarus.freepascal.org/Roadmap#Status_of_features_on_each_LCL_Interface), вы можете скомпилировать проект Lazarus из командной строки, используя такую команду (возможно необходим полный путь к компилятору):
227+
228+``` bash
229+$ lazbuild -B project1.lpr --ws=cocoa --cpu=x86_64 --os=darwin --compiler=/usr/local/bin/ppcx64
230+```
231+
232+Вы можете проверить, что ваш исполняемый файл является 64-битным, использует команду "file":
233+
234+``` bash
235+$ file ./project1
236+$ ./project1: Mach-O 64-bit executable x86_64
237+```
238+
239+Кроме того, вы можете настроить свой проект на компиляцию как 64-бит с помощью графического интерфейса Lazarus:
240+
241+`a.) Выберите пункт меню Project/ProjectOptions`\
242+`b.) В [пункте] CompilerOptions/ConfigAndTarget установите "Target CPU family" в "x86_64"`\
243+`c.) В [пункте] CompilerOptions/AdditionsAndOverrides сохраните "LCLWidgetType := cocoa" в LPI`
244+
245+Обратите внимание, что 64-разрядный компьютер macOS может работать с 32-разрядными исполняемыми файлами. Однако, если вы хотите создать бинарник, который выполняется на 32-разрядном Intel также хорошо, как и в 64-битном режиме на 64-битном компьютере Intel, вы можете использовать команду "lipo". Это позволило бы 64-разрядному компьютеру получить доступ к большему количеству памяти и теоретически возможно немного улучшиться (например, различные оптимизации компилятора, больше регистров, но с большими указателями). Предполагается, что вы создали отдельные 32-разрядные ("project32") и 64-разрядные ("project64") исполняемые файлы на Lazarus.
246+
247+``` bash
248+$ lipo -create project32 project64 -o projectUniversal
249+```
250+
251+## Из Darwin x86_64 на i386
252+
253+Как и выше, \[только вместо\] **CPU_TARGET** используйте **CPU_SOURCE** .
254+
255+## Из Darwin на Windows, Linux и другие \[OC\]
256+
257+В пакете fpc менеджера пакетов [fink](http://finkproject.org/) имеется 64-разрядный компилятор. Кроме того, \[там\] есть список пакетов для кросскомпиляции на windows, linux, freebsd на разных процессорах.
258+
259+Примеры установки кросскомпилятора:
260+
261+``` bash
262+$ fink install fpc-cross-i386-win32
263+```
264+
265+или
266+
267+``` bash
268+$ fink install fpc-cross-arm-linux
269+```
270+
271+Для компиляции используйте эти команды:
272+
273+``` bash
274+fpc -Pi386 -Twin32 FILENAME
275+fpc -Parm -Tlinux FILENAME
276+```
277+
278+Эта команда дает список кросскомпиляторов:
279+
280+``` bash
281+$ fink list fpc-cross
282+```
283+
284+Текущий (fpc 3.0.4) выдает \[следующий список\]:
285+
286+``` bash
287+fpc-cross-arm-gba
288+fpc-cross-arm-linux
289+fpc-cross-arm-nds
290+fpc-cross-arm-wince
291+fpc-cross-arm-armv4t-embedded
292+fpc-cross-arm-armv7m-embedded
293+fpc-cross-i386-darwin
294+fpc-cross-i386-freebsd
295+fpc-cross-i386-go32v2
296+fpc-cross-i386-linux
297+fpc-cross-i386-nativent
298+fpc-cross-i386-netbsd
299+fpc-cross-i386-solaris
300+fpc-cross-i386-win32
301+fpc-cross-i386-wince
302+fpc-cross-jvm-android
303+fpc-cross-jvm-java
304+fpc-cross-m68k-linux
305+fpc-cross-mipsel-linux
306+fpc-cross-powerpc-linux
307+fpc-cross-sparc-linux
308+fpc-cross-x86-64-dragonfly
309+fpc-cross-x86-64-freebsd
310+fpc-cross-x86-64-linux
311+fpc-cross-x86-64-win64
312+```
313+
314+Для других платформ (процессоров и систем) вы должны самостоятельно выполнить настройку. Это в основном та же схема: во-первых, вам нужны соответствующие binutils (см. [[Binutils/ru|Binutils]]), а во-вторых, кросскомпилятор и библиотека времени выполнения. Более подробную информацию о процедуре сборки можно узнать из файлов описания пакетов кросскомпилятора [fink](http://finkproject.org/) выше.
315+
316+# Из FreeBSD
317+
318+## Из FreeBSD на SPARC
319+
320+> **Warning:** Этот раздел, существует примерно с 2005 года и, вероятно, может быть неактуальным. Обновления приветствуются.
321+
322+Я управился с компилятором из x86 на Sparc Solaris 9. Однако результат \[оказался\] не совсем удовлетворительный, и вот моя строка cmd:
323+
324+в компиляторе/ выполняется:
325+
326+``` bash
327+gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
328+```
329+
330+~/src/sollib это каталог, содержащий:
331+
332+- набор .o's из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
333+- libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
334+- набор библиотек *.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
335+
336+Проблема иллюстрируется следующим двоичным кодом.
337+
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`
343+
344+I suspect wrong .o's are taken. Я подозреваю, что взяты неправильные .o-файлы.
345+
346+# Из контейнера Docker
347+
348+Кросскомпиляция "hello world" с \[использованием\] образа Docker и Free Pascal Compiler 3.0.4
349+
350+1\. извлекаем образ docker:
351+
352+``` bash
353+sudo docker pull taraworks/lazarus-cross:0.0.2 #(do not use latest)
354+```
355+
356+2\. создаем контейнер с виртуальным томом на основе извлеченного образа:
357+
358+a\. идентифицируем ID образа (необходимы первые 4 цифры):
359+
360+``` bash
361+sudo docker images
362+```
363+
364+b\. используем образ для контейнера, маппируем виртуальный том из хоста:
365+
366+``` bash
367+sudo docker create --name pascalContainer -v /home/tudi/pascal_files:/home/tudi/pascal_files -ti image ID
368+```
369+
370+3\. запускаем контейнер
371+
372+a\. идентифицируем ID контейнера (необходимы первые 4 цифры):
373+
374+``` bash
375+sudo docker ps -a
376+```
377+
378+b\. запускаем контейнер:
379+
380+``` bash
381+sudo docker start container ID
382+```
383+
384+4\. компилируем файл
385+
386+a\. копируем паскаль-файл hello.pas из <https://github.com/taraworks/lazarus-cross> в папку /home/tudi/pascal_files на хосте:
387+
388+запускаем на хосте:
389+
390+``` bash
391+cd /home/tudi/pascal_files
392+
393+git clone https://github.com/taraworks/lazarus-cross.git
394+```
395+
396+b\. прикрепляем к контейнеру для проверки клонированного репо:
397+
398+запускаем на хосте:
399+
400+``` bash
401+sudo docker attach container ID
402+```
403+
404+press 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 находится в папке с контейнером. не отсоединяйте с выходом из контейнера, пока контейнер остановится.
405+
406+c\. компилируем из контейнер; меняем каталог до папки, содержащей hello.pas:
407+
408+для Windows:
409+
410+``` bash
411+PATH=$PATH:/opt/clang/bin:/opt/osxcross/target/bin /opt/windows/lib/fpc/3.0.4/ppcross386 -Twin32 -va hello.pas
412+```
413+
414+для OSX:
415+
416+``` bash
417+PATH=$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
418+```
419+
420+d\. компилируем из хоста
421+
422+``` bash
423+sudo 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"
424+```
425+
426+# Общие примечания к Unix/Linux
427+
428+Опция -XLA используется для переименования зависимостей библиотек, указанных в модулях паскаля. Формат -XLAold=new, чтобы изменить параметр ld link -l\<old\> на -l\<new\>.
429+
430+Опция -XR\<sysroot\> (недавний trunk) может использоваться для указания системного root целевой \[платформы\]. Он используется для:
431+
432+- добавления префикса к путям добавленной библиотеки по умолчанию; в прошлом вы указывали -Xd и эти пути вручную. Напр., для i386-linux вместо передачи /lib, /usr/lib и /usr/X11R6/lib в ld, он будет передан \<sysroot\>/lib, \<sysroot\>/usr/lib и \<sysroot\>/usr/X11R6/lib в ld.
433+- обнаружения библиотеки C (специфической для Linux): glibc или uclibc. Напр., для попытки обнаружения uclibc '\<sysroot\>/lib/ld-uClibc.so.0'.
434+
435+# Кросскомпиляция LCL
436+
437+Начиная с \[версии\] 0.9.31, LCL является обычным пакетом Lazarus, и среда IDE автоматически \[сделает\] кросскомпиляцию всех необходимых пакетов при изменении целевой платформы вашего проекта.
438+
439+Если что-то пойдет не так, то вот несколько советов, которые могли бы помочь выяснить, в чем причина:
440+
441+## Тест кросскомпилятора
442+
443+Проверьте, правильно ли установлен кросскомпилированный fpc:
444+
445+Создайте программу \[в духе\] "hello world" в test.pas:
446+
447+``` pascal
448+program test;
449+begin
450+ writeln('DATE ',{$i %DATE%});
451+ writeln('FPCTARGET ',{$i %FPCTARGET%});
452+ writeln('FPCTARGETCPU ',{$i %FPCTARGETCPU%});
453+ writeln('FPCTARGETOS ',{$i %FPCTARGETOS%});
454+ writeln('FPCVERSION ',{$i %FPCVERSION%});
455+end.
456+```
457+
458+И скомпилируйте его с исходной/оригинальной платформой. Пример для x86 Windows:
459+
460+``` bash
461+fpc -Twin32 -Pi386 test.pas
462+```
463+
464+Затем проверьте исходный компилятор:
465+
466+``` bash
467+test
468+```
469+
470+Замените *win32* и *i386* своими целями \[(имеется ввиду, "своими" ОС и CPU)\]. Пример для целевой Windows 64 бит:
471+
472+``` bash
473+fpc -Twin64 -Px86_64 test.pas
474+```
475+
476+Затем проверьте кросскомпилятор:
477+
478+``` bash
479+test
480+```
481+
482+Программа **fpc** представляет собой оболочку, которая ищет правильный компилятор (напр., ppcrossx64) для цели и выполняет его.
483+
484+If this does not work, your cross compiler was not installed correctly. When this works you can cross compile the LCL. Если это не сработает, ваш кросскомпилятор был установлен неправильно. Когда это работает, вы можете \[выполнять\] кросскомпиляцию \[посредством\] LCL.
485+
486+## Кросскомпиляция LCL в Lazarus 0.9.30 и ниже
487+
488+Если вы уверены, что ваш кросскомпилятор работает, вы можете выполнить настоящую кросскомпиляцию.
489+
490+Выполните следующие шаги в IDE Lazarus, чтобы выполнить кросскомпиляцию LCL:
491+
492+В более старых IDE:
493+
494+- Определите в *Tools -\> Options -\> Environment -\> Files* \[ в строке\] *Compiler path* путь к *fpc*. Обычно это уже сделано.
495+- Затем откройте *Tools -\> Configure Build Lazarus*.
496+- Установите *Target OS* (напр., в *Win64*) и *Target CPU* (напр., в *x86_64*)
497+- Нажмите кнопку *Build*.
498+
499+### Командная строка
500+
501+Помимо IDE, командная строка также позволяет создавать кросскомпилер LCL.
502+
503+> **Note:** Начиная с \[версии Lazarus\] 0.9.31, вы должны использовать утилиту `lazbuild` для кросскомпиляции пакетов Lazarus. См. `Lazbuild -h` для \[получения\] списка опций.
504+
505+Пример: вы желаете скомпилировать Windows 64, используя кросскомпилятор: сначала тщательно очистите 64-битные остатки \[пакетов\]. Это не касается вашей 32-битной среды:
506+
507+``` bash
508+make distclean LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
509+```
510+
511+Затем соберите LCL и необходимые ей зависимости. Нами используется LCL_PLATFORM, поскольку он, по-видимому, по-прежнему является Windows 32 даже в Windows 64 (виджеты одинаковы).
512+
513+``` bash
514+make packager/registration lazutils lcl LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
515+```
516+
517+Как и в предыдущем разделе, LCL для вашей нормальной ОС не затрагивается.
518+
519+# Кросскомпиляция приложений LCL
520+
521+Сначала вам нужно скомпилировать LCL. См. выше.
522+
523+Кросскомпиляция приложений означает: компиляция + связывание. Когда вы \[сделали\] кросскомпиляцию LCL, компиляционная часть \[остального\] проста. Просто установите в параметрах компилятора IDE целевую ОС и целевой CPU. Трудная часть - это связывание. Если вы \[сделаете\] кросскомпиляцию проекта, вы можете увидеть что-то вроде этого:
524+
525+`/usr/local/bin/arm-linux-ld: cannot find -lX11`
526+
527+Это означает, что вам необходимо установить графические библиотеки целевой системы. Это не имеет ничего общего с FPC/Lazarus, но \[связано\] с библиотеками кросскомпиляции. Некоторые дистрибутивы предоставляют для этого предварительно скомпилированные пакеты. Например, Microsoft предоставляет кросскомпилированные библиотеки WinCE для Windows. В Linux вы можете установить Wine для кросскомпиляции из Linux на Windows. Некоторые дистрибутивы Linux предоставляют 64-битные библиотеки для 32-битных систем.
528+
529+# FAQ по кросскомпиляции
530+
531+## Почему кросскомпиляция?
532+
533+Так вы можете разработать программу для одной ОС/CPU и скомпилировать ее для другой ОС/CPU без перезагрузки или переключения компьютеров.
534+
535+## Почему без кросскомпиляции?
536+
537+Во многих случаях вы хотите протестировать полученную программу на собственной платформе. Компиляция приложения на этой платформе может быть проще в настройке.
538+
539+## Почему \[предпочтительнее\] кросскомпиляция из Unix на Windows, а не наоборот?
540+
541+См. [[Cross compiling for Windows under Linux/ru|Cross compiling for Win32 under Linux]]
542+
543+## Я хочу получить дополнительную информацию о сборках на Freepascal. Где это?
544+
545+Существует общий FAQ в формате pdf о том, как создавать и настраивать FPC: [[buildfaq]]
546+
547+## Ошибки, такие как компилятор "/usr/bin/fpc", не поддерживает целевой arm-linux
548+
549+Помимо других причин, эта ошибка может возникнуть, если вы отредактировали fpc.cfg с неправильными параметрами для кросскомпилятора (напр., указав все параметры в одну строку вместо одной через строку).
550+
551+# См. также
552+
553+- [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt) Заметки о кросскомпиляции
554+- [[Cross compiling for Windows under Linux]]
555+- [GetLazarus - Сделай сам](http://web.archive.org/web/20160927181920/http://www.getlazarus.org/setup/making/) (Сохраненная копия от 27.09.2016)
556+
557+---
558+*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