关于静态/隐式链接与动态/显式链接的误解

问题描述 投票:1回答:1

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

但是,在multiple places中,我读过一些人指的是静态/隐式链接到dll文件,这使我感到困惑。显然,我的某个地方存在知识漏洞,我希望这里的人可以塞住它。

编辑

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

c++ windows linker static-linking dynamic-linking
1个回答
0
投票

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

对于UNIX:

  1. 链接到归档文件(又称静态)库:

    gcc main.o libfoo.a

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

    gcc main.o libfoo.so

  3. libdl的链接,它使您可以dlopen任意其他共享库(链接时不需要存在):

    gcc main.o -ldl

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

在Windows上存在等效项:当您链接到foo.lib时,您正在使用任一个 1或2,具体取决于foo.lib是包含实际代码还是引用foo.dll

使用LoadLibrary时,情况为3。

© www.soinside.com 2019 - 2024. All rights reserved.