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

Can*_*pus 15 c++ shared-libraries static-libraries visual-c++

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

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

我正在使用Microsoft Visual Studio 2003.

iai*_*ain 26

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

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

如果你想让链接器自动链接其他库,那么Stephen的建议将会起作用,并且被非常有信誉的库(如boost和stlport)使用.为此,请将pragma放在静态库的主头文件中.您应该包括静态库及其依赖项.

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

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


Ste*_*utt 7

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