2009-08-07 113 views
14

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

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

我使用Microsoft Visual Studio 2003

回答

22

静态库未链接。它们只是一个目标文件(* .obj或* .o)的集合,它们一起归档成一个库文件(有点像tar/zip文件),以便连接器更容易找到它需要的符号。

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

如果你想链接器自动链接其他库斯蒂芬的建议将工作,并由像声明和stlport非常有信誉的库使用。为此,将该编译指示置于静态库的主头文件中。您应该包含静态库及其依赖项。

但是,IMO此功能实际上是为图书馆编写者,其中库在系统库路径中,因此链接器将很容易找到它。同样在boost和stlport的情况下,他们使用此功能来支持使用#define定义的选项的多个版本的相同库,其中不同版本需要不同版本的库进行链接。这意味着用户不太可能通过一种方式配置提升并与另一个配置的库链接。

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

0

说我有一个静态的C++的lib, static.lib我想从C++共享库调用一些 功能,说 shared.lib。可能吗?

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

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

这样一个有依赖关系后可能导致的问题,我建议你,而不是使用动态加载LoadLibrary()库,这样你就不需要保持这种依赖的轨道在编译/链接。

+0

我同意你应该小心图书馆的依赖,但我认为在这种情况下LoadLibrary是矫枉过正。我只需要它插件类型的体系结构。 – iain 2009-08-07 05:58:00