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

时间:2011-03-26 20:13:56

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

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

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

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

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

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

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

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

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

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

谢谢!

- R的

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

我看到两种可能性

  1. 记录依赖性
  2. 在.h文件中使用#pragma请求链接.lib。如果VS能够找到它,就像在链接线上包含它一样。
  3. http://msdn.microsoft.com/en-us/library/7f0aews7(VS.80).aspx

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

答案 2 :(得分:2)

只记录您的lib的依赖关系。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

请参阅How to Extract .OBJ Routines from .LIB Files Using LIB.EXE - 我希望它仍与VS2008相关。

答案 5 :(得分:1)

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