0

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-09-05T22:03:11.403 回答
1

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

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

于 2012-09-05T21:07:00.717 回答