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

20

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

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

我正在使用Microsoft Visual Studio 2003。

3个回答

35

静态库不是被链接的,它们只是一组目标文件(*.obj或*.o)的归档集合,存储在一个库文件中(类似于tar / zip文件),以便链接器更容易地找到它所需的符号。

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

如果您想让链接器自动链接其他库,Stephen的建议很有效,并且像boost和stlport这样的著名库也在使用。要做到这一点,请在静态库的主头文件中放置pragma。您应该包含静态库及其依赖项。

不过,我认为这个特性实际上是为库编写者而设计的,在系统库路径中的库将更容易被链接器找到。此外,在boost和stlport的情况下,它们使用该功能来支持具有 #define 选项定义的同一库的多个版本,其中不同的选项需要链接不同版本的库。这意味着用户不太可能以一种方式配置boost并链接已配置另一种方式的库。

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


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

1
假设我有一个静态的C++库,static.lib,我想从一个C++共享库shared.lib中调用一些函数,这是可能的吗?
是的,例如当您从静态库中调用Windows函数时,它们通常来自某个动态库,因此不应该有任何区别。
现在假设我有另一个共享库shared2.lib,它链接到static.lib但不链接到shared.lib。在这种情况下,链接器是否会自动将shared2.lib链接到shared.lib?
像这样具有依赖关系可能会在以后引起问题,我建议您改为使用LoadLibrary()动态加载库,这样您就不需要在编译/链接时跟踪这些依赖项。

1
我同意你应该小心处理库依赖,但我认为在这种情况下使用LoadLibrary有些过度了。我只在插件类型的架构中需要它。 - iain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接