1

我正在尝试构建 mod_helloworld.lpr 的 apache 示例,C:\lazarus\components\fpweb\demo\helloworld\apache

拉撒路 0.9.29
FPC 版本 2.4.3 SVN 27129
i386-win32

添加$(LazarusDir)\fpc\2.4.3\source\packages\fcl-web\src\到其他单元文件(-Fu)后,它将编译,但是当我构建/链接时出现错误

mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterCustomImageList
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterMenuItem
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterMenu
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterMainMenu
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterPopupMenu
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterDragImageList
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterControl
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterWinControl
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterGraphicControl
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterCustomControl
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterScrollingWinControl
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterScrollBox
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterCustomFrame
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterCustomForm
mod_helloworld.lpr(38,1) Error: Undefined symbol: WSRegisterHintWindow
mod_helloworld.lpr(38,1) Fatal: There were 15 errors compiling module, stopping

我在猜测它试图添加 lcl 或其他东西,但我真的不知道。

4

2 回答 2

1

想通了……它认为

添加Interfaces到使用原因后,我可以编译 mod_helloworld。

我不知道那是从哪里来的,但我记得这样做是为了让 CGI 协同编译。

但问题是现在,我的 apache 安装不会除了 .dll

LoadModule mod_helloworld "C:\lazarus\components\fpweb\demo\helloworld\apache\mod_helloworld.dll"

httpd.exe:C:/Program Files/Apache Software Foundatio n/Apache2.2/conf/httpd.conf 第 63 行的语法错误:无法加载 C:/lazarus/components/fpweb/demo/hellow orld/apache/mod_helloworld .dll 进入服务器:找不到指定的模块。

但我很可能很快将其作为一个新问题发布

于 2010-10-20T23:23:01.810 回答
0

我在 Ubuntu 10.04 LTS amd64 下遇到了同样的问题。

查看在Lazarus 下编译 WebLaz 项目的问题。

这也可能有帮助:如何选择性地将 Lazarus Apache 模块编译为 Apache 1.3、2.0 和 2.2?

我选择了“删除不必要的文件夹”选项并强制 fpc.cfg 始终指向 httpd22。

我知道这不是最好的,所以我会给出更详细的解释。

假设 FPSRC 包含 FPC 源文件路径,FPCUNITS 包含预编译单元,FPCCFG 包含 fpc.cfg 文件的路径。

如果您查看 FPCCFG,您会发现一个决定 Apache 版本的块:

#IFDEF FPCAPACHE_1_3
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd13/
#ELSE
#IFDEF FPCAPACHE_2_0
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd20/
#ELSE
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd22/
#ENDIF
#ENDIF

按照这里的建议,您可以将这些指令放在 FPCCFG 的顶部,以便编译器可以访问正确的文件夹。

因此,如果 FPC 需要编译它们,它就可以在哪里找到源代码。

现在我们有另一个问题:它没有链接到正确的 ppu。

如果您查看 FPCUNITS,您会发现 3 个文件夹:httpd13、httpd20 和 httpd22。

现在编译器在寻找正确的文件夹/单元组合时,会首先在 httpd13 或 httpd20 下找到它。如果您想要一个 Apache 2.2 模块并且会破坏所有链接,这并不好。

我没有针对这个困境的“智能”解决方案,一个涉及条件指令的解决方案,所以我只是删除了我不想要的 2 个文件夹(在正确备份之后,以防我需要编译/链接到其他 Apache 版本)。在我的例子中是 httpd13 和 httpd20。

我还必须将“-fPIC”添加到我的编译器选项中。它是在来自编译器或链接器的错误消息之一中提出的,但这是我真的不知道它是全局的还是我的 64 位设置的唯一一件事。

我希望这可以在 Windows 下工作。

编辑:我正在构建一个多应用程序项目,并将使用 fpmake.pp 来编译它。一旦我解决了 fpmake.pp 的所有问题,我也会将其发布出来,这样就可以避免其中的一些问题。

于 2010-10-20T10:45:47.810 回答