【问题标题】:Which .OBJ files are linked into which VCL libraries哪些 .OBJ 文件链接到哪些 VCL 库
【发布时间】: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.DCUFOO.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


    【解决方案1】:

    可以使用tlib.exe,例如:

    tlib /l vcl.lib
    

    另一种选择是使用GetPackageInfo 枚举BPL 中的“PACKAGEINFO”资源,如this answer 所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2018-03-25
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多