链接两个静态库

时间:2012-09-05 21:04:24

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

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

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

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

我现在从LNK2019库中收到了几个MyProj.lib错误,说它无法找到API.lib库中定义的符号。 Visual Studio知道两个库文件的位置,所以这对我来说非常混乱。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这种混淆源于误认为.lib文件有些神奇。链接器可以看到 .lib文件具有其他依赖项。事实并非如此,静态.lib只是一包.obj文件。一种将编译器输出收集到单个文件中的方法。没什么,没什么。

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

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

这是C / C ++构建模型中的一个非常薄弱的​​环节,难以修复。供应商试图解决这个问题,微软也做了。他们添加了非标准的#pragma comment(lib,“something.lib”)功能,告诉链接器需要链接“something.iib”而不在链接器的Additional Dependencies设置中明确指定它。非常好。然而,准确地处理 “something.lib”存储是您需要处理的问题。污物。另一种设定。

答案 1 :(得分:1)

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

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