问题 C ++ - 你能在另一个静态库中构建一个静态库吗?


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

我正在尝试编译一个使用另一个静态库中的函数的新静态库。 (假设Lib1是我的静态库项目,Lib2是Lib1依赖的lib文件)。

我可以毫无问题地构建lib1;它包含lib2的头文件并调用它的函数,没有问题。

问题是当我构建一个以Lib1作为依赖项的单独测试项目时;它不会构建,我会收到链接器错误。未解析的外部是我试图在Lib1中调用来自Lib2的函数。

当我在我的测试项目中包含Lib2时,这一切都已修复。

这当然对我来说都是有意义的;我可以测试Lib2没有内置到Lib1 ..

我的问题是:有办法做到这一点吗?理想情况下,我希望能够将Lib1部署为独立的lib而不需要Lib2。 (Lib2实际上只是来自Windows平台SDK的Lib,所以它并不是什么大不了的......)

这是不允许的,因为它允许人们“隐藏”他们自己的第三方图书馆,或者什么?

这个问题的专业方法是什么?

谢谢!

--R


1877
2018-03-26 20:13


起源

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


答案:


我不建议使用图书管理员将Windows的图书馆内容带入您自己的图书馆 - 这可能是违反许可证的。

我看到两种可能性

  1. 记录依赖关系
  2. 在.h文件中使用#pragma请求链接.lib。如果VS可以找到它,它就像在链接线上包含它一样。

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

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

3
2018-03-26 21:16



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


您需要使用名为库管理器的工具来执行此操作。图书管理员允许您创建和修改库(.lib)文件。在Visual Studio中检查项目属性的Librarian部分。命令行版本还附带visual studio(lib.exe)。


3
2018-03-26 21:08



这在技术上是正确的,但Windows平台SDK可能会在其许可证中禁止此操作。 - Lou Franco
这样做的正确设置是什么? - Royi
@Drazick - 看看这个答案: stackoverflow.com/a/2157735/4086 - Ferruccio
@Ferruccio,我尝试了那个问题中提出的标志: stackoverflow.com/a/18200652/195787。然而,当我尝试使用堆叠库编译新项目时,我在链接器中收到有关静态库中H文件的错误。我不明白...... - Royi


只记录lib的依赖关系。

只要您所依赖的库可供任何可以使用您的库的人使用,这是首选解决方案。特别是考虑到图书馆用户可以  取决于这个平台SDK lib - 如果你嵌入了它,那么他会用多重定义的符号得到有趣的链接器错误。


2
2018-03-26 20:18



不好笑:( - CEO at Apartico


这是一个相当正常的问题 - 你通常不会尝试将'lib2'包含在'lib1'中,而只是简单地说明为了工作需要链接它。声明使用其他库(当然除了任何许可问题)没有任何问题,因此您已经做了正确的事情。


1
2018-03-26 20:18





如果你真的想这样做,你可以从Lib2中提取.obj文件并将它们添加到Lib1。

看到 如何使用LIB.EXE从.LIB文件中提取.OBJ例程  - 我希望它仍然与VS2008相关。


1
2018-03-26 20:28





而不是简单地记录您的依赖项,请使用 #pragma comment(lib, 'lib2name')在您的代码中,使链接器自动拉入另一个库。由于您说您使用的是SDK附带的标准库,因此可以消除应用程序的所有负担。


1
2018-03-26 21:11