C++ 关于静态/隐式链接与动态/显式链接的误解
我最近了解到,静态链接和隐式链接只是不同的术语。我的理解是,当您静态(隐式)链接到二进制文件时,根据定义,您是针对C++ 关于静态/隐式链接与动态/显式链接的误解,c++,windows,linker,static-linking,dynamic-linking,C++,Windows,Linker,Static Linking,Dynamic Linking,我最近了解到,静态链接和隐式链接只是不同的术语。我的理解是,当您静态(隐式)链接到二进制文件时,根据定义,您是针对*.lib(windows)或*.a(linux)文件进行链接,通常使用cmake中的目标链接库。另一方面,当您明确链接(在windows上使用LoadLibrary)时,根据定义,您链接到的是*.dll文件(在linux上是*.so)(并且没有相应的cmake命令,因为所有工作都是在实际代码中完成的) 然而,在我的文章中,有人提到静态/隐式链接到dll文件,这让我感到困惑。很明显,
*.lib
(windows)或*.a
(linux)文件进行链接,通常使用cmake中的目标链接库
。另一方面,当您明确链接(在windows上使用LoadLibrary
)时,根据定义,您链接到的是*.dll
文件(在linux上是*.so
)(并且没有相应的cmake命令,因为所有工作都是在实际代码中完成的)
然而,在我的文章中,有人提到静态/隐式链接到dll
文件,这让我感到困惑。很明显,我的知识在某个地方有一个漏洞,我希望这里有人能填补这个漏洞
编辑
有人指出,这个问题主要是指windows,它确实如此。但是,我目前正在尝试生成跨平台代码,因此我仍然对这些概念如何(或是否)推广到其他平台感兴趣。实际上有3种不同的链接,而不是2种 对于UNIX:
gcc main.o libfoo.a
gcc main.o libfoo.so
libdl
,它允许您dlopen
任意其他共享库(链接时不需要存在这些库):
gcc main.o-ldl
foo.lib
时,您使用的是1还是2,这取决于foo.lib
是否包含实际代码,或者引用的是foo.dll
使用
LoadLibrary
时,在案例3中。这些东西对于不同的操作系统是不同的。当您在本机可执行文件c++
中使用.NET/CLR时,会链接到.dll
链接到导入库或使用.def
或直接使用LoadLibrary如果这些东西对于不同的操作系统是不同的,尝试使用cmake编写跨平台共享库是否有意义?尝试使用cmake编写跨平台共享库是否有意义?对您可能想看看Kitware软件,如itk
如何处理在不同平台上构建共享库的问题。在将代码库转换为跨平台之前,请先尝试一些小的示例项目。使用运行时动态链接,您可以通过SetDefaultDllDirectories
和AddDllDirectory
控制DLL搜索路径,这比使用加载时链接的默认DLL搜索路径更安全,其中包括工作目录和路径。但是,通过LoadLibraryExW
和GetProcAddress
手动链接非常繁琐,因为必须为编译器指定函数原型才能生成正确的代码。Windows有更好的方法:。