【问题标题】:Link against two static libraries链接两个静态库
【发布时间】:2012-09-05 21:04:23
【问题描述】:

我正在处理一个包含多个 Visual Studio 项目的大型项目。这些项目构建为静态库并包含在主项目中,我们称之为Main.exe

我创建了一个新项目并将其构建为静态库,我们称之为MyProj.lib。这个库依赖于另一个静态库,我们称之为API.lib

现在,我需要将我的项目链接到主项目。目前我有两个静态库链接到主项目。我之前问过这个问题:Link static library in another static library,发现我不能嵌套静态库。 Paul Michalik 指出,当我构建 Main 项目时,我需要简单地独立链接这两个库。

我现在从MyProj.lib 库中收到几个LNK2019 错误,说它找不到API.lib 库中定义的符号。 Visual Studio 知道这两个库文件的位置,所以这让我很困惑。有什么想法吗?

【问题讨论】:

    标签: c++ visual-studio-2010 static-libraries


    【解决方案1】:

    这种混淆源于错误地认为 .lib 文件在某种程度上是神奇的。链接器可以看到 .lib 文件具有其他依赖项。事实并非如此,静态 .lib 只是一袋 .obj 文件。一种将编译器输出收集到单个文件中的方法。不多也不少。

    特别令人困惑的是,当您构建 库时,它永远不会抱怨缺少依赖项。对此的解释很简单,构建一个库运行链接器。只是将 .obj 文件收集到包中的 lib.exe 工具。

    在您实际运行链接器来构建最终的可执行文件之前,它不会组合在一起。现在所有的部分都必须放在一起,链接器 必须 还可以查看包含依赖项的 .obj 或 .lib 文件。它不抱怨时会抱怨。

    这是 C/C++ 构建模型中的一个非常薄弱的​​环节,很难修复。供应商试图解决这个问题,微软也这样做了。他们添加了非标准的#pragma comment(lib, "something.lib") 功能来告诉链接器它需要链接“something.iib”,而无需您在链接器的附加依赖项设置中明确指定它。很不错。然而,准确处理 where "something.lib" 的存储是您需要处理的问题。粗鲁。另一个设置。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是简单地将.lib 文件添加到依赖它们的每个项目中。如果它很重要(它可能对 VS 无关),请将依赖库放在依赖库之前。

      这样做的(可能的)缺点是库在更改时不会自动重新编译。

      【讨论】:

      • 您是说将API.lib 链接到MyProj.lib 并在主项目中链接两者?我已经尝试过了,它给了我大约 3600 多个链接器警告。
      • @Derek:如果 MyProj.lib 包含 API.lib,就会发生这种情况。但是 MyProj 应该只包含对 API 和其他任何东西的外部引用,而不是引用的模块和符号。
      • 好吧,我想我跟着你了。现在MyProj.lib 正在构建为一个库,而没有链接到API.lib
      猜你喜欢
      • 2015-09-21
      • 2011-06-13
      • 2021-06-13
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多