代码之家  ›  专栏  ›  技术社区  ›  Canopus

C++静态库可以链接到共享库吗?

  •  15
  • Canopus  · 技术社区  · 17 年前

    现在假设我有另一个共享库,比如shared2.lib,它链接到static.lib,但不链接到shared.lib。在这种情况下,链接器是否自动将shared2.lib链接到shared.lib?

    我正在使用Microsoft Visual Studio 2003。

    3 回复  |  直到 17 年前
        1
  •  31
  •   iain    17 年前

    静态库没有链接。它们只是对象文件(*.obj或*.o)的集合,这些文件一起归档到库文件中(有点像tar/zip文件),以便链接器更容易找到所需的符号。

    如果您想使用链接器自动链接其他库,Stephen的建议会起作用,而且像boost和stlport这样的知名库也会使用它。为此,将pragma放在静态库的主头文件中。您应该包括静态库及其依赖项。

    然而,在我看来,这个特性实际上是针对库编写器的,因为库位于系统库路径中,所以链接器很容易找到它。此外,在boost和stlport中,它们使用此功能支持相同库的多个版本,并使用定义的选项 #define 不同的选项需要链接库的不同版本。这意味着用户不太可能以一种方式配置boost,也不太可能链接到另一种方式配置的库。

    我对应用程序代码的偏好是显式链接所需的部分。

        2
  •  7
  •   Stephen Nutt    17 年前

    #pragma comment (lib, "static.lib") 通过将pragma添加到头文件来简化链接其他文件的过程。

        3
  •  1
  •   AndersK    17 年前

    假设我有一个静态C++库, static.lib,我想调用一些

    是的,例如,当您从静态库中调用windows函数时,它们通常来自某个动态库,所以应该没有区别。

    现在假设我有另一个共享的 lib,比如shared2.lib,它链接到 自动将shared2.lib链接到 在这种情况下是shared.lib吗?

    有这样的依赖关系可能会在以后引起问题,我建议您改为使用动态加载库 LoadLibrary() ,这样您就不需要在编译/链接时跟踪这些依赖项。