19

假设我有一个静态 C++ 库 static.lib,我想从 C++ 共享库中调用一些函数,比如 shared.lib。是否可以?

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

我正在使用 Microsoft Visual Studio 2003。

4

3 回答 3

33

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

静态库可以调用未定义的函数(但仅在头文件中声明),因为它仅被编译。然后,当您链接使用静态库的 exe 或 dll 时,您将不得不链接另一个库,该库提供从静态库调用但未在其中定义的库。

如果您希望链接器自动链接其他库,Stephen 的建议将起作用,并且被 boost 和 stlport 等非常有名的库所使用。为此,请将编译指示放在静态库的主头文件中。您应该包括静态库及其依赖项。

然而,IMO 这个特性实际上是为库编写者设计的,其中库位于系统库路径中,因此链接器很容易找到它。同样在 boost 和 stlport 的情况下,它们使用此功能来支持相同库的多个版本,其中使用#defines 定义的选项,其中不同的选项需要链接不同版本的库。这意味着用户不太可能以一种方式配置 boost 并与另一种配置的库链接。

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

于 2009-08-07T05:54:20.387 回答
7

链接器不会自动引入其他库,但您可以使用#pragma 注释 (lib, "static.lib")通过将 pragma 添加到头文件中来简化链接附加文件的过程。

于 2009-08-07T04:09:49.800 回答
1

假设我有一个静态 C++ 库 static.lib,我想从 C++ 共享库中调用一些函数,比如 shared.lib。是否可以?

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

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

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

于 2009-08-07T05:53:57.967 回答