假设我有一个静态C ++库,static.lib,我想从C ++共享库中调用一些函数,比如shared.lib。有可能吗?
现在假设我有另一个共享库,比如shared2.lib链接到static.lib但没有链接到shared.lib。在这种情况下,链接器是否会自动将shared2.lib链接到shared.lib?
我正在使用Microsoft Visual Studio 2003。
答案 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()动态加载库,这样你就不需要在编译/链接时跟踪这些依赖。