在Embarcadero RAD Studio XE3中链接C ++项目时(关闭Use Runtime Packages),我有时会收到以下形式的错误:
[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
答案 0 :(得分:6)
您可以使用tlib.exe,例如:
tlib /l vcl.lib
另一个选择是列举' PACKAGEINFO' BPL中的资源,使用GetPackageInfo中显示的this answer。