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

时间:2009-08-07 03:56:27

标签: c++ shared-libraries visual-c++ static-libraries

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

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

我正在使用Microsoft Visual Studio 2003。

3 个答案:

答案 0 :(得分:26)

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

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

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:1)

  

假设我有一个静态C ++库,   static.lib,我想打电话给一些   例如,来自C ++共享库的函数   shared.lib。有可能吗?

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

  

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

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