哪个.OBJ文件链接到哪个VCL库

时间:2014-08-04 06:19:06

标签: delphi c++builder static-linking vcl c++builder-xe3

在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

1 个答案:

答案 0 :(得分:6)

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

tlib /l vcl.lib

另一个选择是列举' PACKAGEINFO' BPL中的资源,使用GetPackageInfo中显示的this answer