关于 static/implicit 链接与 dynamic/explcit 链接的误解

Misconception about static/implicit linking Vs dynamic/explcit linking

我最近了解到静态 linking 和隐式 linking 是 basically the same thing,只是术语不同。我的理解是,当你静态地(隐含地)link 到一个二进制文件时,你根据定义 linking 反对 *.lib(windows)或 *.a( linux) 文件,经常在 cmake 中使用 target_link_libraries。另一方面,当你明确地 link(在 windows 上使用 LoadLibrary)时,你根据定义 linking 到 *.dll 文件(或 *.so on linux) (并且没有相应的 cmake 命令,因为所有工作都在实际代码中完成)。

但是,在 multiple places 中,我读到有人提到 statically/implicitely linking 到 dll 文件,这让我感到困惑。显然我的知识某处存在漏洞,我希望这里有人可以填补它。

编辑

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

实际上有 3 种不同的 linking,而不是 2 种。

对于 UNIX:

  1. Link 针对存档(又名静态)库:

    gcc main.o libfoo.a

  2. link 针对动态(又名共享)库:

    gcc main.o libfoo.so

  3. Link 反对 libdl,它允许您 dlopen 任意其他共享库(在 link):

    gcc main.o -ldl

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

Windows 上存在等效项:当您 link 反对 foo.lib 时,您使用的是 1 或 2,具体取决于是否foo.lib 包含实际代码,或引用 foo.dll.

当你使用LoadLibrary时,你就是情况3.