在链接时,共享库(.so)文件需要存在(或指定)吗?
在链接时,共享库(.so)文件需要存在(或指定)吗?
共享库(.so)文件在链接时需要存在(或指定)吗?
我在这里阅读到(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须在编译时存在,但根据我的经验,这并不准确。
共享库不是在运行时使用dlopen和dlsym进行链接吗,因此当应用程序链接时,该库可能不存在于系统中?
有时候在编译时,我们会遇到一个问题:是否需要在链接时指定共享库文件(.so文件)的存在。这会导致一些困惑,因为有时候我们会在编译时指定共享库,而有时候又不需要。实际上,这两种方式都可以正常工作。
如果在编译时指定了共享库文件,那么在运行时就可以直接使用这个共享库中的所有函数,而不需要通过dlopen/LoadLibrary等函数来显式加载共享库。这样做的好处是可以方便地使用共享库中的函数,而不需要额外的操作。
但是,如果在编译时指定了共享库文件,那么这个共享库在运行时仍然会被动态地链接。也就是说,编译时指定共享库只是为了方便使用其中的函数,但是在运行时仍然需要动态地加载和链接共享库。
总结起来,无论在编译时是否指定共享库文件,它们在运行时都会被动态地链接。指定共享库只是为了方便使用其中的函数,而不需要显式加载共享库。
解决这个问题的方法很简单,只需要根据实际需要来决定是否在编译时指定共享库文件即可。如果需要方便地使用共享库中的函数,可以在编译时指定共享库文件;如果不需要,可以不指定。
这样一来,我们就可以根据实际情况来选择是否在编译时指定共享库文件,从而解决这个问题。无论我们选择哪种方式,都可以正常地使用共享库中的函数。
在Linux系统中,大多数共享库在构建时和运行时都需要存在。共享库不同于Windows的动态链接库(DLL)。
例如,如果您正在编译一个Qt应用程序,在构建和运行该应用程序时都需要Qt共享库(例如/usr/lib/x86_64-linux-gnu/libQt5Gui.so
等)。可以阅读关于动态链接器ld-linux.so(8)和ELF的相关信息。
但是您问的是关于动态加载(使用dlopen(3)和dlsym(3)等)插件的问题。
那么可以阅读Levine的《Linkers & Loaders》、《Program Library HowTo》、《C++ dlopen mini HowTo》,以及Drepper的《How To Write Shared Libraries》等资料。
还可以参考这个答案。
一些库和框架尝试以与操作系统无关的方式抽象插件的加载。可以阅读关于Qt插件支持,或者关于POCO共享库(命名不准确,实际上是关于插件)的相关内容。
所以,共享库是否总是可以用于动态加载?.so文件在链接时必须指定的原因是程序直接调用函数,而不是间接使用dlopen()吗?
您需要阅读我给出的所有参考资料(需要一周以上的时间)。具体细节因操作系统而异。
谢谢,我会的!