Ben*_*y K 10 c c++ linux windows shared-libraries
在Windows下,当我在MSVC的DLL项目中编译C / C ++代码时,我得到2个文件:
MyDll.dllMyDll.lib据我了解,MyDll.lib其中包含某种指示符表,用于指示dll中的函数位置。使用此dll时(例如在exe文件中),MyDll.lib在链接期间会嵌入到exe文件中,因此在运行时它“知道”函数的位置MyDll.dll并可以使用它们。
但是,如果我在Linux下编译相同的代码,我只会得到一个MySo.so不带 文件的文件MySo.a(相当于libLinux中的文件),那么MySo.so如果在链接过程中未嵌入任何内容,Linux下的可执行文件如何知道函数的位置?
在 Linux 上,链接器(不是动态链接器)搜索链接时指定的共享库,并在可执行文件内创建对它们的引用。当动态链接器加载这些可执行文件时,它将它们所需的共享库加载到内存中并解析符号,从而允许运行二进制文件。
MySo.a如果创建的话,实际上会包含直接链接到二进制文件的符号,而不是 Windows 上使用的“符号查找表”。
rustyx 的回答比我更彻底地解释了 Windows 上的过程;我已经很久没有使用Windows了。