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是静态链接。“静态链接器”似乎只是指构建的链接阶段。是的,我说的是生成二进制文件的链接步骤。