【问题标题】:fatal error C1084: Cannot read type library file: 'Smegui.tlb': Error loading type library/DLL致命错误 C1084:无法读取类型库文件:“Smegui.tlb”:加载类型库/DLL 时出错
【发布时间】:2011-03-04 06:21:39
【问题描述】:

我正在尝试构建一个旧版本的应用程序,其中包含用 Visual Studio 2003 编写的 VC++ 项目。

我的操作系统是 Windows 7 Enterprise(64 位)。 当我尝试构建解决方案时,出现以下错误:

  • 错误 C4772:#import 引用了缺少类型库中的类型; '__missing_type__' 用作占位符
  • 致命错误 C1084:无法读取类型库文件:“Smegui.tlb”:加载类型库/DLL 时出错。

他们都抱怨以下导入语句:

#import "Smegui.tlb" no_implementation

这不是文件路径不正确的情况,因为重命名 Smegui.tlb 文件会导致编译器抛出另一个错误,说它找不到库。

Smegui 来自另一个依赖于它的应用程序。我想也许我错过了一个 dll,但没有像 Smegui.dll 这样的东西。

我所知道的 .tlb 文件是一个类型库,您可以使用 tlbexp.exe 或 regasm.exe 从程序集创建它们(后者也使用 COM 注册程序集)

还有一个 Apache Ant 构建脚本,它使用自定义任务调用 devenv.com 来构建项目。这与构建服务器最初用于构建应用程序的脚本相同。当我尝试运行它时,它给了我同样的错误。

关于这件事最奇怪的是,我知道它应该可以工作,因为它都是从 subversion 中重新检查出来的。我尝试了管理员与用户提升、VS 与 Ant 构建、清理、发布的许多不同组合。

我已经成功构建了大约 5 次,但构建似乎是不确定的。

如果有人能阐明这个 tlb 东西是如何工作的,或者这个错误可能意味着什么,我将不胜感激。

【问题讨论】:

    标签: visual-c++ dll typelib


    【解决方案1】:

    我找到了一个更可靠的解决方案:使用 oleview.exe 打开 tlb,然后将其关闭。

    不确定这实际上是做什么的,但它每次都有效。

    我认为 oleview 实际上是 Visual Studio 中包含的示例之一,但我没有时间调试它并查看它在做什么。

    【讨论】:

    • 也解决了我的问题,你救了我:)
    • 以前也为我工作,但在过去几年(可能在 64 位操作系统之后?),当 OleView 应该添加缺少的 TLB 注册时会挂起:(
    【解决方案2】:

    我遇到了这个错误,因为一个类型库试图加载一个它找不到的依赖类型库。即使依赖类型库在同一目录中,即使该目录在可搜索路径中,编译器也会错误加载第一个类型库,但不会在错误中提及依赖类型库。

    为了找到伪缺失类型库,我在编译期间运行了 Process Monitor (procman64.exe)。这表明在成功加载报告的类型库后,找不到依赖的类型库。它甚至显示了它正在寻找依赖类型库的所有地方,但没有一个是它应该寻找的地方(例如:)。

    修复方法是在项目中添加一个<PreBuildEvent>,以将依赖的.tlb 文件复制到实际正在搜索的目录之一。

    <PreBuildEvent>
      <Command>copy /Y ..\Lib\Interop\CWSpeechRecLib.tlb .\</Command>
    </PreBuildEvent>
    

    【讨论】:

    • 谢谢,在fatal error C1084: Cannot read type library file: 'xxxxxxxxxx': Error loading type library/DLL. 的半天战斗后,使用 ProcMon 帮助了我
    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/sce74ah7%28VS.71%29.aspx

    smegui.tlb 正在引用编译器找不到的其他一些 tlb。如果您有 smegui 的 .idl,您可能能够弄清楚另一个是什么。我怀疑丢失的 tlb 是原始构建机器已注册但您的机器尚未注册的东西。

    类型库是一组接口、coclasses 和枚举的二进制描述。它们通常是为 COM 组件生成的,在 tlbexp 和 regasm 的情况下,tlb 是从程序集元数据创建的。对于原生 COM 组件,它们通常由 midl 工具从 idl(接口描述语言)文件生成。

    编辑:

    我刚刚注意到您使用的是 x64 Windows。您是否使用新版本的 Visual Studio 构建项目?如果是这样,您的目标是 x86 还是 x64?如果是后者,它可能只是编译器找不到的 32 位组件(或者不太可能,如果您的目标是 x86,x86 编译器找不到 x64 组件),对于 WOW64,注册表是针对 x86 与x64 应用程序。

    【讨论】:

    • 感谢您的帮助。很高兴了解 idl。 C++ 绝对不是我的强项。是的,它正在运行 Win32 的构建版本,其他依赖项也是 32 位的。
    【解决方案4】:

    嗯,我终于明白了为什么有时我能成功地构建它,而不是其他的......有点。

    只要我以提升的管理员权限运行构建脚本并让它尽可能多地运行直到发生错误,然后在受保护的管理员成功时再次运行构建脚本。这些步骤必须按照确切的顺序完成,中间没有其他步骤。如果我尝试在 Visual Studio 中构建它不起作用(尽管我确实让它成功了一次)。可能是某种虚拟化问题,尽管它仍然不太有意义。

    好吧,我不再需要这方面的帮助,而且我知道如果不确切知道构建在做什么,可能不可能完全回答这个问题。但是,如果有人确实有更多想法,我会很乐意接受。

    干杯,

    斯坦尼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2012-10-29
      • 2019-01-23
      • 2010-11-01
      相关资源
      最近更新 更多