首页 > 解决方案 > 关于静态/隐式链接与动态/显式链接的误解

问题描述

我最近了解到静态链接和隐式链接基本上是同一件事,只是命名法不同。我的理解是,当您静态(隐式)链接到二进制文件时,根据定义链接到*.lib(windows)或*.a(linux)文件,通常target_link_libraries在cmake中使用。另一方面,当您显式链接(LoadLibrary在 Windows 上使用)时,您根据定义链接到*.dll文件(或*.so在 linux 上)(并且没有相应的 cmake 命令,因为所有工作都在实际代码中完成)。

但是,在多个地方,我读到有人提到静态/隐式链接到dll文件,这让我感到困惑。很明显,我的知识在某个地方存在漏洞,我希望这里有人可以堵住它。

编辑

有人指出,这个问题主要是指窗户,它确实如此。但是,我目前正在尝试生成跨平台代码,因此我仍然对这些概念如何(或是否)推广到其他平台感兴趣。

标签: c++windowslinkerstatic-linkingdynamic-linking

解决方案


实际上有 3 种不同类型的链接,而不是 2 种。

对于 UNIX:

  1. 链接到归档(又名静态)库:

    gcc main.o libfoo.a

  2. 链接到动态(又名共享)库:

    gcc main.o libfoo.so

  3. Link against libdl,它允许您dlopen任意其他共享库(在链接时不需要存在):

    gcc main.o -ldl

2 和 3 都涉及动态链接器(并且正在使用共享库),但程度不同。

Windows 上存在等价物:当您链接到 时foo.lib,您使用的是1 或 2,具体取决于是否foo.lib包含实际代码或引用foo.dll.

当您使用 时LoadLibrary,您是第 3 种情况。


推荐阅读