我最近了解到静态链接和隐式链接是basically the same thing,只是术语不同。我的理解是,当您静态(隐式)链接到二进制文件时,通过定义链接到*.lib
(Windows)或*.a
(linux)文件,通常在cmake中使用target_link_libraries
。另一方面,当您显式链接(在Windows上使用LoadLibrary
)时,根据定义,您正在链接到*.dll
文件(或在Linux上为*.so
)(并且没有相应的cmake命令,因为所有工作都在内部完成实际代码)。
但是,在multiple places中,我读过一些人指的是静态/隐式链接到dll
文件,这使我感到困惑。显然,我的某个地方存在知识漏洞,我希望这里的人可以塞住它。
已经指出,这个问题主要是针对Windows。但是,我目前正在尝试生成跨平台代码,因此我仍然对这些概念如何(或是否)能推广到其他平台感兴趣。
实际上有3种不同的链接,不是2。
对于UNIX:
链接到归档文件(又称静态)库:
gcc main.o libfoo.a
链接到动态(aka共享)库:
gcc main.o libfoo.so
与libdl
的链接,它使您可以dlopen
任意其他共享库(链接时不需要存在):
gcc main.o -ldl
2和3都涉及动态链接器(并且正在使用共享库),但是程度不同。
在Windows上存在等效项:当您链接到foo.lib
时,您正在使用任一个 1或2,具体取决于foo.lib
是包含实际代码还是引用foo.dll
。
使用LoadLibrary
时,情况为3。