C++ - 你能否将一个静态库构建到另一个静态库中?

11

最近我在使用Visual Studio 2008项目时遇到了一个奇怪的问题。

我试图编译一个使用另一个静态库函数的新静态库。(假设Lib1是我的静态库项目,而Lib2是Lib1依赖的Lib文件)。

我可以顺利地构建lib1;它包含Lib2的头文件并调用其函数,没有问题。

问题出现在当我构建一个独立的测试项目,并将Lib1作为依赖项时;它无法构建,我会得到链接错误。未解析的外部元素是我尝试从Lib1中调用的来自Lib2的函数。

当我也将Lib2包含在我的测试项目中时,这个问题就解决了。

当然,这一切都对我来说很有意义;我可以测试Lib2是否被构建到Lib1中。

我的问题是:有没有一种方法可以实现这一点?理想情况下,我希望能够将Lib1部署为单独的库,而不需要Lib2。(Lib2实际上只是来自Windows平台SDK的Lib,所以这并不是什么大问题...)

这不允许是因为它会允许人们在他们自己的库中"隐藏"第三方库,或者其他原因吗?

这个问题的专业解决方案是什么?

谢谢!

--R


在将Lib1包含到你的项目中之前,你是否完全编译了它? - Raceimaztion
你解决了这个问题吗?你做了什么? - Royi
老实说,我不记得了;这是很久以前的事了。我想我只是记录了依赖关系,但我不记得具体细节,抱歉。 - 8bitcartridge
6个回答

3

您需要使用一个叫做“librarian”的工具来完成这个操作。Librarian能够创建和修改库文件(.lib)。在Visual Studio中,查找项目属性下的Librarian部分即可找到它。另外,Visual Studio也提供了一个命令行版本(lib.exe)。


2
这在技术上是正确的,但很可能Windows平台SDK在其许可证中禁止这样做。 - Lou Franco
@Ferruccio,我尝试了那个问题中建议的标志:https://dev59.com/n3I95IYBdhLWcg3wyBCc#18200652。但是,当我尝试使用堆叠库编译新项目时,链接器仍然会出现有关静态库中H文件的错误。我不明白... - Royi

3
我不建议使用图书管理员将Windows的库内容导入您自己的库中 - 这可能违反许可证。
我看到两种可能性:
1.记录依赖项。 2.在您的.h文件中使用#pragma请求链接.lib。如果VS可以找到它,那么它与在链接行中包含它是相同的。

http://msdn.microsoft.com/en-us/library/7f0aews7(VS.80).aspx

 #pragma comment(lib, "libname.lib")

你在说什么?这不可能做不到吗?谢谢。 - Royi
我说的只是,如果这个库来自微软(就像在这个问题中),以这种方式分发它很可能违反许可证。我没有评论它是否在技术上可行。 - Lou Franco
如果这是我有分发许可的库,该怎么办?如何操作?谢谢。 - Royi
阅读其他答案,其中有像这样的链接:http://support.microsoft.com/kb/31339。 - Lou Franco

2

只需记录您的库的依赖关系。

只要您所依赖的库可供任何可能使用您的库的人使用,这就是首选解决方案。特别是考虑到库用户也可能依赖于此平台SDK库 - 如果您将其嵌入,则会出现具有多个已定义符号的有趣链接器错误。


1
这是一个相当普遍的问题 - 通常不会尝试将 'lib2' 包含到 'lib1' 中,而只需记录它需要链接才能正常工作。声明使用其他库没有任何问题(当然除了任何许可证问题),所以您已经在做正确的事情。

1

1

不要仅仅记录您的依赖关系,而是在代码中使用#pragma comment(lib, 'lib2name')来使链接器自动拉取其他库。由于您说您正在使用随 SDK 附带的标准库,因此这应该消除应用程序上的所有负担。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接