典型问题与技巧¶
cannot nd -l<xxxx>¶
由于 Lazarus 需要链接到共享库,因此构建 lazarus 测试 FPC 配置的一个方面,尚未经过上述部分的测试。典型的错误是:
1 2 3 4 | Linking ./lazarus
/usr/libexec/elf/ld: cannot find -lglib12
lazarus.pp(334) Error: Error while linking
Closing script ./ppas.sh
|
这意味着链接器在构建可执行文件时,无法找到 libglib12.a 或 libglib12.so。这通常不是 FPC 错误,因为 glib 是 GTK 的一部分,属于操作系统。可能没有安装 gtk(或者相应的 gtk-devel 包)。
还有4种可能性:
在安装软件包时,软件包管理器没有创建 libglib12.so 的符号链接(即将 libglib.12.so.x 链接到 libglib12.so)。手动创建符合链接,如执行 cd /usr/local/lib; ln -s libglib12.so.2 libglib12.so 会解决此问题。
(上述情况的实际问题)FPC 不会搜索正确目录的库,因为你没有在 fpc.cfg 中使用 -Fl。将 -Fl/usr/local/lib 添加到 /etc/fpc.cfg 文件中,即可解决该问题。
在某个地方有 {$LINKLIB xx},或某个脚本中有 -l<xx> 参数或生成一个强制 FPC 尝试链接库,但现在没必要了,在这种情况下,grep 是你最好的朋友。
由于某些原因,你的发行版中将它命名为库。因此,将搜索到的符号名称改为真实名称即可解决。
CONTNRS or other FCL-BASE units not found¶
如果编译器不能找到 contnrs,则表明 -Fu 路径存在问题。可能是 -Fu 错了。但是将 make 文件设为自动添加到 RTL 中,而 contnrs(或其它 FCL-BASE)单元则是第一个无法找到的单元。它可以指向重复的 .ppu 文件或混合的 FPC 版本。
piping stderr and stdout to the same file.¶
将 make 进行的 stderr 和 stdout 输出到同一个文件中,可用于调试。这在 Unix 上使用 >& 轻松完成。在 Windows 下有点复杂,但仍可以完成:
make install 1> filename.txt 2>&1
此行,使用 1> 将 install 的 stdout 输出传递给 filename.txt,将 stderr(2>)重定向到 stdout(&1)。
(Windows)构建和安装失败,出现不可见错误¶
当我完成所有安装时,突然遇到问题,查看调试信息时,在 make 中显示:
make: [fpc_clean] Error 1 (ignored)
这将导致全部停止:
make: *** [fpcmade.i386-win32] Error 1
这是一个与 mingw 相关的问题,在项目源码中留下了一个 sh.exe,另一个解决方案是,永远不要一次性使用这些命令,而是将它们作为单独的命令编写脚本。
我验证了 sh.exe,在使用 make -j 2 时,如果没有找到 sh.exe,它会发出一个警告,提示 -j 功能已禁用。假设 make 文件必须忽略错误,而不是某处的所有错误。
注意:尽管使用了 mingw 工具,但不建议在路径中包含 mingw 目录,一些 mingw 工具(最著名的是 make.exe)当它检测到 sh.exe 时会改变行为。