【问题标题】:C++ - Can you build one static library into another?C++ - 你可以将一个静态库构建到另一个库中吗?
【发布时间】:2011-07-23 15:13:45
【问题描述】:

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

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

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

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

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

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

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

这是不允许的,因为它会允许人们将第三方库“隐藏”在自己的库中,还是什么?

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

谢谢!

--R

【问题讨论】:

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

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


【解决方案1】:

我不建议使用图书管理员将 Windows 的库内容放入您自己的库中——这可能违反了许可。

我看到了两种可能性

  1. 记录依赖关系
  2. 在 .h 文件中使用 #pragma 来请求链接 .lib。如果 VS 能找到它,就和在你的链接行中包含它一样。

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

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

【讨论】:

  • 你在说什么?这不能做吗?谢谢。
  • 我所说的只是,如果该库来自 Microsoft(就像在这个问题中一样),那么以这种方式分发它可能会违反许可证。我没有评论这在技术上是否可行。
  • 如果我有分发许可的库怎么办?怎么可能呢?谢谢。
  • 阅读其他答案,有这样的链接:support.microsoft.com/kb/31339
【解决方案2】:

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

【讨论】:

  • 这在技术上是正确的,但很可能 Windows 平台 SDK 在其许可证中禁止这样做。
  • @Ferruccio,我尝试了该问题中建议的标志:stackoverflow.com/a/18200652/195787。然而,当我尝试使用堆叠库编译一个新项目时,我在链接器中收到一个关于来自静态库的 H 文件的错误。我不明白...
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        不要简单地记录您的依赖关系,而是在您的代码中使用#pragma comment(lib, 'lib2name') 以使链接器自动拉入另一个库。既然您说您使用的是 SDK 附带的标准库,那么这应该可以消除应用程序的所有负担。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          相关资源
          最近更新 更多