在Embarcadero RAD Studio XE3中链接C ++项目(关闭“使用运行时程序包”)时,有时会出现以下形式的错误:

[ilink32 Error] Fatal: Unable to open file 'FOO.OBJ'

我了解是什么原因造成的。这是因为代码中存在一个隐式引用(通常通过#pragma link),这导致链接程序需要单元FOO

而且,如果我查看VCL源代码,通常可以找到一个FOO.PAS并将其编译为FOO.DCU。那是链接器正在寻找但找不到的已编译单元。

我知道此编译单元位于VCL库之一中,但是我不知道如何找出哪个库。例如,VCL.LIB和RTL.LIB和BCBIE.LIB(等等)包含哪些单元?

给定一个单元名称,我想知道哪个VCL库包含它。如果我知道这一点,则可以将适当的.lib文件添加到cbproj文件中的LinkPackageStatics标记中,然后一切都将正常链接。

如果只是在该单元的文档中显示了它,那将是很好的,但是它不存在。当前,我必须反复试验才能找到正确的库,但是肯定可以在某个地方找到可公开获得的清单,以显示哪些VCL单元链接到了哪个VCL库。

在哪里可以找到这样的清单?

(顺便说一句,我知道在IDE的正常使用中,开发人员不需要知道这一点。IDE通常会为您解决此问题。但是,我发现当.cbproj合并错误时,我有时会需要此信息。或手动编辑不正确,或出于超出IDE正常使用范围的其他原因。)

编辑:谢谢! tlib正是我需要的。我对shell脚本非常不满意,但是我写了一个小shell脚本,该脚本在库包含的每个单元的名称旁边输出库的名称:

#!/bin/bash
while [ "$1" != "" ]; do
    name=$(basename "$1")
    tlib /L $name | grep size | awk -v name=$name '{print name, "\t", $1}'
    shift
done


然后,我可以通过在所有感兴趣的.libs上执行脚本来调用脚本,然后为所需的单元(例如SysUtils)grepping:

find . -name "*.lib" -exec libunits.sh {} \; | grep SysUtils

最佳答案

您可以使用tlib.exe,例如:

tlib /l vcl.lib


另一个选择是使用GetPackageInfo中所示的this answer枚举BPL中的'PACKAGEINFO'资源。

关于delphi - 哪些.OBJ文件链接到哪些VCL库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25112768/

10-11 00:52