关于apache2:构建mod_helloworld.lpr

Building mod_helloworld.lpr

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

Lazarus 0.9.29
FPC Verion 2.4.3 SVN 27129
i386-win32

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 什么的,但我真的不知道。


想通了……它认为

在uses中加入Interfaces后,就可以编译mod_helloworld了。

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

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

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

httpd.exe: Syntax error on line 63 of
C:/Program Files/Apache Software
Foundatio n/Apache2.2/conf/httpd.conf:
Cannot load
C:/lazarus/components/fpweb/demo/hellow
orld/apache/mod_helloworld.dll into
server: The specified module could not
be found.

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


我在 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 版本的块:

1
2
3
4
5
6
7
8
9
#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 的所有问题,我也会将其发布,以便避免其中一些问题。