在Linux中使用Lazarus LCL编译Pascal代码

os8fio9y  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(159)

我正试图在Linux上编译/端口,这是一个最初在Windows上用 Delphi 编写的项目。我对Windows上的 Delphi 没有任何经验,对Pascal也只有非常有限的经验。
我在Ubuntu 22.04.3 LTS中运行,并且我已经安装了系统提供的 FreepascalLazarus,带有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项目是不是坏了(这意味着,我应该从源代码编译它们吗)?

smdnsysy

smdnsysy1#

正如@HeartWare在评论中所指出的,不可能向前推进的根本原因是代码使用了Windows、窗体和许多其他微软特有的单元,这些单元没有Linux的等价物。这是不幸的,但最不幸的方面是,它不清楚在所有从阅读文档作为一个新手,在那里听起来像他们已经移植了所有单位的所有操作系统。
但最耗时的问题是,编译代码,我需要一个巨大的

fpc -Fu/usr/share/lazarus/2.2.2/lcl/                    \
    -Fu/usr/share/lazarus/2.2.2/components/lazutils/    \
    -Fu/usr/share/lazarus/2.2.2/lcl/widgetset/          \
    -Fu/usr/share/fpcsrc/3.2.2/rtl/linux                \
    -Fu/usr/share/lazarus/2.2.2/lcl/nonwin32/           \
    -Fu/usr/share/fpcsrc/3.2.2/packages/pasjpeg/src/    \
    -Fi/usr/share/lazarus/2.2.2/lcl/include/            \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/inc/                 \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/linux                \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/x86_64/              \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/unix/                \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/win/                 \
    -Fi/usr/share/fpcsrc/3.2.2/rtl/linux/x86_64/        \
    -FU./lib                                            \
    -MDELPHI                                            \
     my.dpr

这既包括操作系统提供的安装,也包括freepascal.org提供的(二进制)安装。熟悉其他几种编程语言,这听起来真的很违反直觉,因为/usr中的东西总是被编译器/解释器自动包含,因为在一些全局配置中如此指定,例如。/usr/include/在C.
我仍然不明白这是不是 FreePascal 的方式,或者是我的操作系统的二进制安装有什么问题,因为它缺乏全局配置设置。

相关问题