在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/