Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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++_C_Linker - Fatal编程技术网

C++ 当链接二进制或共享库时,为什么我必须传入我所依赖的共享库?

C++ 当链接二进制或共享库时,为什么我必须传入我所依赖的共享库?,c++,c,linker,C++,C,Linker,假设我正在尝试创建一个二进制myprogrammyprogram包括一个文件foo.h,其中声明了一些函数;这些函数在libfoo.so中定义。因此,在构建myprogram时,我将libfoo.so传递给链接器…不,不是名称“libfoo.so”,而是实际的共享库文件 我的问题是,为什么这是必要的?我的理解是,只有在运行时才需要共享库,此时动态链接器将其加载到内存中,并在myprogram中修复对它的所有引用。静态链接器使用libfoo.so除了将其名称放入共享库列表之外,还做了什么?您混淆了

假设我正在尝试创建一个二进制
myprogram
myprogram
包括一个文件
foo.h
,其中声明了一些函数;这些函数在
libfoo.so
中定义。因此,在构建
myprogram
时,我将
libfoo.so
传递给链接器…不,不是名称“libfoo.so”,而是实际的共享库文件


我的问题是,为什么这是必要的?我的理解是,只有在运行时才需要共享库,此时动态链接器将其加载到内存中,并在
myprogram
中修复对它的所有引用。静态链接器使用libfoo.so除了将其名称放入共享库列表之外,还做了什么?

您混淆了静态链接库和动态链接库。动态库依赖于加载到内存中的运行时模块,并通过导出的方法访问它所需的内容。静态库实际上直接嵌入到您自己的二进制文件中,而不是单独加载。

您混淆了静态链接库和动态链接库。动态库依赖于加载到内存中的运行时模块,并通过导出的方法访问它所需的内容。静态库实际上直接嵌入到您自己的二进制文件中,而不是单独加载

除了将其名称放入共享库列表之外,静态链接器对
libfoo.so
做了什么

对于生成动态链接的可执行文件,基本上就是这样!它还确认,在链接时可用的共享库版本中,所有未定义的符号引用都由其中一个共享库定义。此属性允许您进行有意义的构建时(autoconf样式)测试,例如确保
libfoo。因此
是一个足够新的版本,其中包含
bar
功能

除了将其名称放入共享库列表之外,静态链接器对
libfoo.so
做了什么


对于生成动态链接的可执行文件,基本上就是这样!它还确认,在链接时可用的共享库版本中,所有未定义的符号引用都由其中一个共享库定义。此属性允许您进行有意义的构建时(autoconf样式)测试,例如确保
libfoo。因此
是一个足够新的版本,其中包含
bar
功能。

我认为OP不是静态链接。“静态链接器”似乎只是指构建的链接阶段。是的,我说的是生成二进制文件的链接步骤。我不认为OP是静态链接。“静态链接器”似乎只是指构建的链接阶段。是的,我说的是生成二进制文件的链接步骤。