我正试图在Linux上编译/端口,这是一个最初在Windows上用 Delphi 编写的项目。我对Windows上的 Delphi 没有任何经验,对Pascal也只有非常有限的经验。
我在Ubuntu 22.04.3 LTS中运行,并且我已经安装了系统提供的 Freepascal 和 Lazarus,带有sudo apt install fp-units-* lcl-* lazarus lcl fpc-*
(我通过尝试和错误来达到这个列表,这有助于我在小错误方面取得进展)。
当我尝试编译顶级程序文件时,它失败如下:
$ fpc myprogr.dpr
Free Pascal Compiler version 3.2.2+dfsg-9ubuntu1 [2022/04/11] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling myprogr.dpr
myprogr.dpr(4,3) Fatal: Can't find unit Forms used by myprogr
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
这很奇怪,因为东西就在那里
$ dpkg -S /usr/lib/lazarus/2.2.0/lcl/forms.pp
lazarus-src-2.2: /usr/lib/lazarus/2.2.0/lcl/forms.pp
$ ls -l /usr/lib/lazarus/2.2.0/lcl/forms.pp
-rw-r--r-- 1 root root 92597 Jan 2 2022 /usr/lib/lazarus/2.2.0/lcl/forms.pp
这让我相信我正在使用的包有问题,但无论如何,我手动添加路径,失败变成了:
$ fpc -Fu/usr/lib/lazarus/2.2.0/lcl/ myprogr.dpr
Free Pascal Compiler version 3.2.2+dfsg-9ubuntu1 [2022/04/11] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling myprogr.dpr
Compiling /usr/lib/lazarus/2.2.0/lcl/forms.pp
forms.pp(24,2) Fatal: Cannot open include file "lcl_defines.inc"
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
又像以前一样奇怪了,因为:
$ dpkg -S lcl_defines.inc
lazarus-src-2.2: /usr/lib/lazarus/2.2.0/lcl/include/lcl_defines.inc
$ ls -l /usr/lib/lazarus/2.2.0/lcl/include/lcl_defines.inc
-rw-r--r-- 1 root root 325 Jul 11 2020 /usr/lib/lazarus/2.2.0/lcl/include/lcl_defines.inc
我可以再做一次改进:
$ fpc -Fu/usr/lib/lazarus/2.2.0/lcl/ -I/usr/lib/lazarus/2.2.0/lcl/include/ myprogr.dpr
Free Pascal Compiler version 3.2.2+dfsg-9ubuntu1 [2022/04/11] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling myprogr.dpr
Compiling /usr/lib/lazarus/2.2.0/lcl/forms.pp
Compiling /usr/lib/lazarus/2.2.0/lcl/lclstrconsts.pas
Writing Resource String Table file: lclstrconsts.rsj
lclstrconsts.pas(481) Error: Writing Resource String Table file: > /usr/lib/lazarus/2.2.0/lcl/lclstrconsts.rsj
lclstrconsts.pas(481) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
这继续着奇怪的事情,因为:
$ dpkg -S lclstrconsts.rsj
lcl-units-2.2: /usr/lib/lazarus/2.2.0/lcl/units/x86_64-linux/lclstrconsts.rsj
$ ls -l /usr/lib/lazarus/2.2.0/lcl/units/x86_64-linux/lclstrconsts.rsj
-rw-r--r-- 1 root root 77783 Apr 11 2022 /usr/lib/lazarus/2.2.0/lcl/units/x86_64-linux/lclstrconsts.rsj
最重要的是,为什么编译器试图在全局位置而不是本地写入,但我离题了。
当然,我看了Freepascal,Lazarus和Ubuntu/Debian文档(以及通用的Web搜索),似乎没有任何迹象表明这类问题。
我可以跳进兔子洞,继续对所有这些进行逆向工程,甚至可能成功地编译我需要的项目,但我宁愿问:我做错什么了吗我的发行版中的Freepascal和Lazarus项目是不是坏了(这意味着,我应该从源代码编译它们吗)?
1条答案
按热度按时间smdnsysy1#
正如@HeartWare在评论中所指出的,不可能向前推进的根本原因是代码使用了Windows、窗体和许多其他微软特有的单元,这些单元没有Linux的等价物。这是不幸的,但最不幸的方面是,它不清楚在所有从阅读文档作为一个新手,在那里听起来像他们已经移植了所有单位的所有操作系统。
但最耗时的问题是,编译代码,我需要一个巨大的
这既包括操作系统提供的安装,也包括freepascal.org提供的(二进制)安装。熟悉其他几种编程语言,这听起来真的很违反直觉,因为
/usr
中的东西总是被编译器/解释器自动包含,因为在一些全局配置中如此指定,例如。/usr/include/
在C.我仍然不明白这是不是 FreePascal 的方式,或者是我的操作系统的二进制安装有什么问题,因为它缺乏全局配置设置。