【发布时间】:2014-08-04 06:19:06
【问题描述】:
在 Embarcadero RAD Studio XE3(关闭使用运行时包)中链接 C++ 项目时,有时会收到以下形式的错误:
[ilink32 Error] Fatal: Unable to open file 'FOO.OBJ'
我明白是什么原因造成的。这是因为代码中有一个隐式引用(通常通过#pragma link)导致链接器需要单元FOO。
如果我查看 VCL 源代码,我通常可以找到编译为 FOO.DCU 的 FOO.PAS。那是链接器正在寻找但找不到的编译单元。
我知道这个编译后的单元存在于一个 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 上执行该脚本来调用该脚本,然后通过 grepping 查找我正在寻找的单元(如 SysUtils):
find . -name "*.lib" -exec libunits.sh {} \; | grep SysUtils
【问题讨论】:
标签: delphi c++builder static-linking vcl c++builder-xe3