Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于静态/隐式链接与动态/显式链接的误解_C++_Windows_Linker_Static Linking_Dynamic Linking - Fatal编程技术网

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

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

    Windows上存在一个等效项:当您链接到
    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有更好的方法:。