Sign in Join
Wiki copytemporary

Cross compiling for Win32 under Linux/zh CN: what changed

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

OldNewLine
1+## Contents
2+
3+ * 1 概述
4+ * 1.1 介绍 - 了解你在做什么
5+ * 2 Free Pascal
6+ * 2.1 为什么是从*nix到Windows,而不是从Windows到*nix
7+ * 2.2 较新的FPC - 2.1.1及较新的版本
8+ * 2.3 在Bunsen Labs系统下的一个示例(Debian 8)
9+ * 2.4 较老的FPC,早于2.1.1
10+ * 3 Lazarus/LCL
11+ * 3.1 交叉编译LCL和Lazarus组件
12+ * 3.2 交叉编译一个工程
13+ * 3.3 交叉编译和Lazarus的提示
14+ * 3.4 交叉编译和Lazarus软件包
15+ * 4 参考
16+ * 5 贡献者和更改
17+
118## 概述
219
320### 介绍 - 了解你在做什么
421
5-**注意 :** 如果你的FPC来自你的Linux发行版存储库,那么它很可能不会有转换成交叉编译器的东西。请查看[[Installing the Free Pascal Compiler|安装Free Pascal编译器 - Linux]]。
22+**注意 :** 如果你的FPC来自你的Linux发行版存储库,那么它很可能不会有转换成交叉编译器的东西。请查看[[Installing the Free Pascal Compiler|安装Free Pascal编译器 - Linux]]。
623
7-这是针对新手的一份简短介绍。下面的部分将解释如何设置一个Linux系统来交叉编译,创建Win32可执行文件(或者为FreeBSD或者为Darwin/macOS,或者为...)。为什么交叉编译?Free Pascal是一个编译器,,基本上就是将源文件转换为二进制文件(机器语言)。这些二进制文件也包含操作系统应该如何启动可执行文件的信息。所以,这些二 进制文件是特定于平台的。
24+这是针对新手的一份简短介绍。下面的部分将解释如何设置一个Linux系统来交叉编译,创建Win32可执行文件(或者为FreeBSD或者为Darwin/macOS,或者为...)。为什么交叉编译?Free Pascal是一个编译器,,基本上就是将源文件转换为二进制文件(机器语言)。这些二进制文件也包含操作系统应该如何启动可执行文件的信息。所以,这些二 进制文件是特定于平台的。
825
9-Free Pascal本身不需要多少设置。它可以为很多平台创建二进制文件。只需要告诉它来做什么就行。但是编译器只是其中的一部分。
26+Free Pascal本身不需要多少设置。它可以为很多平台创建二进制文件。只需要告诉它来做什么就行。但是编译器只是其中的一部分。
1027
11-这里也有汇编器和链接器。并且这些工具不能创建交叉平台的代码。这就是为什么我们必须为每一个目标平台创建一个特 殊的链接器'ld'和汇编器'as'。这些都是二进制实用程序。
28+这里也有汇编器和链接器。并且这些工具不能创建交叉平台的代码。这就是为什么我们必须为每一个目标平台创建一个特 殊的链接器'ld'和汇编器'as'。这些都是二进制实用程序。
1229
13-在创建交叉工具后,所有的FPC的Pascal单元也将被交叉编译。例如,针对每个目标平台都将会有一个目标系统 的.ppu文件。 接下来,你将会设置FPC的配置文件(fpc.cfg),以便交叉编译将变得很容易,这样你可以 忘记所有令人厌倦的细节。同样的事情也会发生在LCL - Lazarus组件库上。并且在这之后,你可以为Win32交叉编译Pascal程序。要么使用wine启动它们,要么将它们复制到一个Windows机 器上,并在其中测试它们。
30+在创建交叉工具后,所有的FPC的Pascal单元也将被交叉编译。例如,针对每个目标平台都将会有一个目标系统 的.ppu文件。 接下来,你将会设置FPC的配置文件(fpc.cfg),以便交叉编译将变得很容易,这样你可以 忘记所有令人厌倦的细节。同样的事情也会发生在LCL - Lazarus组件库上。并且在这之后,你可以为Win32交叉编译Pascal程序。要么使用wine启动它们,要么将它们复制到一个Windows机 器上,并在其中测试它们。
1431
1532## Free Pascal
1633
1734### 为什么是从*nix到Windows,而不是从Windows到*nix
1835
19-主要原因是,在一个外部平台上(甚至是在另一个Unix或Linux系统上)生成Linux/Unix二进制文件更为复杂。 静态链接已经很复杂了,更不要说动态链接了。
36+主要原因是,在一个外部平台上(甚至是在另一个Unix或Linux系统上)生成Linux/Unix二进制文件更为复杂。 静态链接已经很复杂了,更不要说动态链接了。
2037
21-你可能需要使用来自目标平台的库(gtk, glib, libc等等),以及针对ld的很多附加的配置(库路径,动态链接器路径等)。
38+你可能需要使用来自目标平台的库(gtk, glib, libc等等),以及针对ld的很多附加的配置(库路径,动态链接器路径等)。
2239
23-这样已经部分完成了(针对静态情况),但是它是很难的,因为它需要对链接器文件和链接器命令行进行手动后期编辑, 并且对Unix二进制文件做出深刻的理解。
40+这样已经部分完成了(针对静态情况),但是它是很难的,因为它需要对链接器文件和链接器命令行进行手动后期编辑, 并且对Unix二进制文件做出深刻的理解。
2441
2542### 较新的FPC - 2.1.1及较新的版本
2643
27-如果你正在编译FPC的一个2.1.1或者较新的版本,你只需要这样做:
28-
29-``` bash
44+如果你正在编译FPC的一个2.1.1或者较新的版本,你只需要这样做:
45+```
3046$ make all OS_TARGET=win32 CPU_TARGET=i386
3147```
3248
33-然后
34-
35-``` bash
49+然后
50+```
3651$ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"
3752```
3853
39-> **Note:**\
40-> make crossinstall默认情况下在**/usr/local/lib/fpc/\$fpcversion/units** 目录下安装所有的文件,这就是你需要添加一个新的搜索路径到**/etc/fpc.cfg file**的原因,路径: **-Fu/usr/local/lib/fpc/\$fpcversion/units/\$fpctarget/***.\
41-> \
42-> 另外一个选项是,在执行make crossinstall期间使用可选项INSTALL_PREFIX=**/usr**。在这种情况下,你将不需要更改在**/etc/fpc.cfg**文件中的任何东西,因为所有的文件都将添加到已经存在的**/usr/lib/fpc/\$fpcversion/units**目录下。
54+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
4355
44-> **Note:**\
45-> 构建win64的版本的make命令是: make all OS_TARGET=win64 CPU_TARGET=x86_64
56+**Note:**
57+make crossinstall默认情况下在**/usr/local/lib/fpc/$fpcversion/units** 目录下安装所有的文件,这就是你需要添加一个新的搜索路径到**/etc/fpc.cfg file** 的原因,路径: **-Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/***.
58+
59+另外一个选项是,在执行make crossinstall期间使用可选项INSTALL_PREFIX=**/usr** 。在这种情况下,你将不需要更改在**/etc/fpc.cfg** 文件中的任何东西,因为所有的文件都将添加到已经存在的**/usr/lib/fpc/$fpcversion/units** 目录下。
4660
47-之所以这么简单是因为在fpc的这个版本中已经包含了内部链接器。
61+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
4862
49-### 在Bunsen Labs系统下的一个示例(Debian 8)
63+**Note:**
64+构建win64的版本的make命令是: make all OS_TARGET=win64 CPU_TARGET=x86_64
5065
51-\- 使用FPC 3.0.0和Lazarus 1.6.2交叉编译到Win32和Win64。
66+
67+之所以这么简单是因为在fpc的这个版本中已经包含了内部链接器。
5268
53-\- 打开你的终端并执行下面的命令(为此非常感谢Handoko和Leledumbo,你们真是令人敬畏)。
69+### 在Bunsen Labs系统下的一个示例(Debian 8)
5470
55-``` bash
71+\- 使用FPC 3.0.0和Lazarus 1.6.2交叉编译到Win32和Win64。
5672
73+\- 打开你的终端并执行下面的命令(为此非常感谢Handoko和Leledumbo,你们真是令人敬畏)。
74+```
5775# Navigate to the fpc source folder.
58-cd /usr/share/fpcsrc/3.0.0
59-
60-# Compile the cross-compiler.
61-make all OS_TARGET=win32 CPU_TARGET=i386
62-
63-# Install the cross-compiler.
64-sudo make crossinstall OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=/usr
65-
66-# Link the cross-compiler and place the link where Lazarus can see it.
67-sudo ln -sf /usr/lib/fpc/3.0.0/ppcross386 /usr/bin/ppcross386
68-
69-# Do the same using x64 as target
70-make all OS_TARGET=win64 CPU_TARGET=x86_64
71-sudo make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=/usr
72-sudo ln -sf /usr/lib/fpc/3.0.0/ppcrossx64 /usr/bin/ppcrossx64
76+ cd /usr/share/fpcsrc/3.0.0
77+
78+ # Compile the cross-compiler.
79+ make all OS_TARGET=win32 CPU_TARGET=i386
80+
81+ # Install the cross-compiler.
82+ sudo make crossinstall OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=/usr
83+
84+ # Link the cross-compiler and place the link where Lazarus can see it.
85+ sudo ln -sf /usr/lib/fpc/3.0.0/ppcross386 /usr/bin/ppcross386
86+
87+ # Do the same using x64 as target
88+ make all OS_TARGET=win64 CPU_TARGET=x86_64
89+ sudo make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=/usr
90+ sudo ln -sf /usr/lib/fpc/3.0.0/ppcrossx64 /usr/bin/ppcrossx64
7391```
7492
75-\- 确保你的交叉编译器是存在的:(注意,链接到交叉编译二进制文件出现在/usr/bin中,而不是仅出现在/usr/lib中,如下图所示)。
93+\- 确保你的交叉编译器是存在的:(注意,链接到交叉编译二进制文件出现在/usr/bin中,而不是仅出现在/usr/lib中,如下图所示)。
7694
77-<figure>
78-<img src="000-cross-compilers-compiled.png" title="000-cross-compilers-compiled.png" />
79-<figcaption>000-cross-compilers-compiled.png</figcaption>
80-</figure>
95+[![000-cross-compilers-compiled.png](/wiki-images/e/e6/000-cross-compilers-compiled.png)](</File:000-cross-compilers-compiled.png>)
8196
82-\- 确保你的交叉编译器已经正确的链接:
97+\- 确保你的交叉编译器已经正确的链接:
8398
84-<figure>
85-<img src="000-cross-compilers-linked.png" title="000-cross-compilers-linked.png" />
86-<figcaption>000-cross-compilers-linked.png</figcaption>
87-</figure>
99+[![000-cross-compilers-linked.png](/wiki-images/7/76/000-cross-compilers-linked.png)](</File:000-cross-compilers-linked.png>)
88100
89-\- 现在,打开Lazarus。
101+\- 现在,打开Lazarus。
90102
91-\- 按 Ctrl+Shift+F11,或导航到 工程-\>工程选项-\>路径菜单。在弹出的"工程选项"对话框的右侧列表中找到"路径"选项。
103+\- 按 Ctrl+Shift+F11,或导航到 工程->工程选项->路径菜单。在弹出的"工程选项"对话框的右侧列表中找到"路径"选项。
92104
93-\- 针对每次构建,配置你的路径,以便所有需要的库都是可获取的,并且由Lazarus/FPC生成所有输出文件不需要重写。在"单元输出路径"和"目标文件 名称"中,我选择使用宏命令。
105+\- 针对每次构建,配置你的路径,以便所有需要的库都是可获取的,并且由Lazarus/FPC生成所有输出文件不需要重写。在"单元输出路径"和"目标文件 名称"中,我选择使用宏命令。
94106
95-<figure>
96-<img src="002-paths-win32.png" title="002-paths-win32.png" />
97-<figcaption>002-paths-win32.png</figcaption>
98-</figure>
107+[![002-paths-win32.png](/wiki-images/5/57/002-paths-win32.png)](</File:002-paths-win32.png>)
99108
100-\- 在"构建模式: \[BuildName\]" 窗口中(单击上面的\[...\]按钮来打开它),创建构建模式和编辑构建模式。 ![](/wiki-images/7/7b/001-build-modes.png)
109+\- 在"构建模式: [BuildName]" 窗口中(单击上面的[...]按钮来打开它),创建构建模式和编辑构建模式。 [![001-build-modes.png](/wiki-images/7/7b/001-build-modes.png)](</File:001-build-modes.png>)
101110
102-\- 当你完成后,单击ok
111+\- 当你完成后,单击ok
103112
104-\- 现在,转到 运行-\>编译多种模式。按ok。一直等到Lazarus和FPC完成它们的工作。
113+\- 现在,转到 运行->编译多种模式。按ok。一直等到Lazarus和FPC完成它们的工作。
105114
106-<figure>
107-<img src="003-build-many-modes.png" title="003-build-many-modes.png" />
108-<figcaption>003-build-many-modes.png</figcaption>
109-</figure>
115+[![003-build-many-modes.png](/wiki-images/0/07/003-build-many-modes.png)](</File:003-build-many-modes.png>)
110116
111-\- 转到你的工程文件夹,好好享受!
117+\- 转到你的工程文件夹,好好享受!
112118
113-<figure>
114-<img src="004-executables.png" title="|||Write once, compile anywhere." />
115-<figcaption>|||Write once, compile anywhere.</figcaption>
116-</figure>
119+[![Write once, compile anywhere.](/wiki-images/6/62/004-executables.png)](</File:004-executables.png> "Write once, compile anywhere.")
117120
118121### 较老的FPC,早于2.1.1
119122
120-针对早于2.1.1的FPC版本,请查看历史链接(在2014年08月19日之前的版本)来查看需要的步骤。
123+针对早于2.1.1的FPC版本,请查看历史链接(在2014年08月19日之前的版本)来查看需要的步骤。
121124
122125## Lazarus/LCL
123126
124127### 交叉编译LCL和Lazarus组件
125128
126-当你更改你的工程的目标并构建它时,Lazarus IDE会自动交叉编译所有使用的软件包。.
129+当你更改你的工程的目标并构建它时,Lazarus IDE会自动交叉编译所有使用的软件包。.
127130
128131### 交叉编译一个工程
129132
130-按 Ctrl+Shift+F11,或导航到 工程-\>工程选项,在弹出的"工程选项"对话框的右侧列表中找到 编译器选项路径-\>配置和目标,在右侧的 目标平台 中,设置 目标操作系统 为 'win32' ,在右侧的 目标-具体选项 中,勾选 Win32图形界面应用程序(-WG,忽略)。这就是全部。你下次构建时,你将创建一个win32可执行文件。
133+按 Ctrl+Shift+F11,或导航到 工程->工程选项,在弹出的"工程选项"对话框的右侧列表中找到 编译器选项路径->配置和目标,在右侧的 目标平台 中,设置 目标操作系统 为 'win32' ,在右侧的 目标-具体选项 中,勾选 Win32图形界面应用程序(-WG,忽略)。这就是全部。你下次构建时,你将创建一个win32可执行文件。
131134
132-Lazarus IDE将重新扫描win32单元,因此现在 '查找声明' 和代码补全特色将使用win32 rtl工作,而不再是使用linux rtl工作。当你打开另一个工程或重新打开这个工程时,lazarus IDE将自动切换。
135+Lazarus IDE将重新扫描win32单元,因此现在 '查找声明' 和代码补全特色将使用win32 rtl工作,而不再是使用linux rtl工作。当你打开另一个工程或重新打开这个工程时,lazarus IDE将自动切换。
133136
134137### 交叉编译和Lazarus的提示
135138
136-如果你为多个目标创建一个应用程序/软件包,你通常将执行下面的动作:在Linux下编译和测试它,接 下来在win32下编译和测试它,因为你每次切换目标时,你通常会重写你的.ppu文件,你必须重新编译所有的东西。这是没有必要的,因为Lazarus IDE支持宏命令。
139+如果你为多个目标创建一个应用程序/软件包,你通常将执行下面的动作:在Linux下编译和测试它,接 下来在win32下编译和测试它,因为你每次切换目标时,你通常会重写你的.ppu文件,你必须重新编译所有的东西。这是没有必要的,因为Lazarus IDE支持宏命令。
137140
138-示例1:为Linux和win32交叉编译一个工程。
141+示例1:为Linux和win32交叉编译一个工程。
139142
140-导航到 工程-\>工程选项,在弹出的"工程选项"对话框的右侧列 表中找到"编译器选项"。在右侧的 路径 中设置 '单元输出目录'为 \$(TargetOS)。这个宏将替换Code -\> TargetOS中值为小写值 (例如,针对Linux的 "linux"和针对Win32的"win32")。输出目录是相对于你的工程目录的(你的.lpi文件所在位置的目录)。 在你的工程目录中会创建一个linux和win32目录。
143+导航到 工程->工程选项,在弹出的"工程选项"对话框的右侧列 表中找到"编译器选项"。在右侧的 路径 中设置 '单元输出目录'为 $(TargetOS)。这个宏将替换Code -> TargetOS中值为小写值 (例如,针对Linux的 "linux"和针对Win32的"win32")。输出目录是相对于你的工程目录的(你的.lpi文件所在位置的目录)。 在你的工程目录中会创建一个linux和win32目录。
141144
142-当你单击编译器选项底部的"显示选项"时,你将看到一个-FElinux/或-FEwin32/。这个选项将告诉 编译器在何处写入输出文件(例如,ppu/.o 文件)。
145+当你单击编译器选项底部的"显示选项"时,你将看到一个-FElinux/或-FEwin32/。这个选项将告诉 编译器在何处写入输出文件(例如,ppu/.o 文件)。
143146
144-示例2:为各种平台和widget集交叉编译工程。
147+
148+示例2:为各种平台和widget集交叉编译工程。
145149
146-设置 单元输出目录 为 \$(TargetCPU)/\$(TargetOS)/\$(LCLWidgetType) ,并为所有的目录创建子目录。LCL也使用这个路径构造。
150+设置 单元输出目录 为 $(TargetCPU)/$(TargetOS)/$(LCLWidgetType) ,并为所有的目录创建子目录。LCL也使用这个路径构造。
147151
148-软件包也可以这样做。
152+软件包也可以这样做。
149153
150154### 交叉编译和Lazarus软件包
151155
152-Lazarus软件包不限于库。它们几乎可以用于编译所有的东西。如果需要,Lazarus IDE 会自动重新编译它们。
156+Lazarus软件包不限于库。它们几乎可以用于编译所有的东西。如果需要,Lazarus IDE 会自动重新编译它们。
153157
154-软件包可以继承编译器选项。例如:一个工程使用一个软件包,并继承软件包的输出目录。换句话说:软件包的输出目录 将被添加到工程的单元搜索路径中。在Lazarus IDE中查看:导航到: 工程 -\> 工程选项,在弹出的"工程选项"对话框的最下部找到"显示选项",在弹出的"编译器选项"对话框找到 继承的参数 标签页。
158+软件包可以继承编译器选项。例如:一个工程使用一个软件包,并继承软件包的输出目录。换句话说:软件包的输出目录 将被添加到工程的单元搜索路径中。在Lazarus IDE中查看:导航到: 工程 -> 工程选项,在弹出的"工程选项"对话框的最下部找到"显示选项",在弹出的"编译器选项"对话框找到 继承的参数 标签页。
155159
156-继承通常只起一种作用,但是也有异常: 工程的目标平台(OS和CPU)重写(override)所有所使用软件包 的目标。这意味着,如果你设置工程的 目标操作系统为"win32",并编译工程,Lazarus IDE将检查是否需要为这个目标操作系统来重新编译所使用的软件包。
160+继承通常只起一种作用,但是也有异常: 工程的目标平台(OS和CPU)重写(override)所有所使用软件包 的目标。这意味着,如果你设置工程的 目标操作系统为"win32",并编译工程,Lazarus IDE将检查是否需要为这个目标操作系统来重新编译所使用的软件包。
157161
158-例如:
162+例如:
159163
160-工程使用软件包A,而软件包A有输出目录: lib/\$(TargetOS)
164+工程使用软件包A,而软件包A有输出目录: lib/$(TargetOS)
161165
162-1. 为linux构建工程。Lazarus IDE将在\<PackageDirOfA\>/lib/linux/中为linux编译A,接下来,它将为linux编译工程。
163-2. 为win32构建工程。Lazarus IDE将在\<PackageDirOfA\>/lib/win32/中为win32编译A,接下来,它将为win32编译工程。
164-3. 为linux再次构建工程。Lazarus IDE将针对Linux做一次针对A的检查,但并不会重新编译A,接下来,它将为linux编译工程。
166+ 1. 为linux构建工程。Lazarus IDE将在<PackageDirOfA>/lib/linux/中为linux编译A,接下来,它将为linux编译工程。
167+ 2. 为win32构建工程。Lazarus IDE将在<PackageDirOfA>/lib/win32/中为win32编译A,接下来,它将为win32编译工程。
168+ 3. 为linux再次构建工程。Lazarus IDE将针对Linux做一次针对A的检查,但并不会重新编译A,接下来,它将为linux编译工程。
165169
166-所以,使用宏命令可以节省很多时间。
170+所以,使用宏命令可以节省很多时间。
167171
168172## 参考
169173
170-- [[Cross compiling|交叉编译]]
171-- [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt) 关于交叉编译的注释
172-- [[buildfaq|构建指南]]
174+ * [[Cross compiling|交叉编译]]
175+ * [crossnotes](<http://www.stack.nl/~marcov/crossnotes.txt>) 关于交叉编译的注释
176+ * [[buildfaq|构建指南]]
173177
174178# 贡献者和更改
175179
176-- 简体中文版本由 robsean 于 2021-06-25 创建(2021-07-08完成全部翻译)。
180+ * 简体中文版本由 [ robsean](</User:Robsean> "User:Robsean") 于 2021-06-25 创建(2021-07-08完成全部翻译)。
177181
178182---
179-*From the Free Pascal wiki, page "Cross compiling for Win32 under Linux/zh CN", 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).*
180-Category: Cross compilation
181-Category: FPC
182-Category: Lazarus
183+*From the Free Pascal wiki, page "Cross compiling for Win32 under Linux/zh CN", as the Internet Archive kept it on 2023-09-24. 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