2012-09-05 55 views
0

我正在一个非常大的项目,有几个Visual Studio项目。这些项目构建为静态库并包含在Main项目中,我们称之为Main.exe链接对两个静态库

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

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

我现在从MyProj.lib库中得到几个LNK2019错误,说它找不到在API.lib库中定义的符号。 Visual Studio知道两个库文件都在哪里,所以这对我来说非常混乱。有任何想法吗?

回答

2

这种混淆源于错误的认为.lib文件有点神奇。链接器可能请参阅 .lib文件具有其他依赖关系。情况并非如此,静态的.lib只是一包.obj文件。一种将编译器输出收集到单个文件的方法。没有更多,没有更多。

什么是特别令人困惑的是,当你建立图书馆,它不会抱怨失踪的依赖关系。对此的解释很简单,建立一个库不是而是运行链接器。只需将收集.obj文件的lib.exe工具放入包中即可。

直到您真正运行链接器来构建最终的可执行文件时,它才会聚集在一起。现在所有作品必须汇集在一起​​,链接器也有也可以查看包含依赖关系的.obj或.lib文件。它没有时抱怨。

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

1

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

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

+0

你是说将'API.lib'链接到'MyProj.lib'并链接两个主项目?我试过了,它给了我大约3600+链接器警告。 – Derek

+0

@ Derek:如果MyProj.lib *包含* API.lib,就会发生这种情况。但MyProj应该只包含对API的外部引用以及其他任何内容,而不是引用的模块和符号。 – wallyk

+0

好吧,我想我跟着你。现在'MyProj.lib'正在构建为一个库,而不连接到'API.lib'。 – Derek