共享库(.so)文件需要在链接时呈现(或指定)吗?共享库(.so)文件需要在链接时呈现(或指定)吗?
我读过这里(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须出现在编译时,但根据我的经验,这是不正确的?
没有共享库只是在运行时使用dlopen
和dlsym
链接,以便该应用程序链接时该库可能不存在于系统上?
共享库(.so)文件需要在链接时呈现(或指定)吗?共享库(.so)文件需要在链接时呈现(或指定)吗?
我读过这里(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须出现在编译时,但根据我的经验,这是不正确的?
没有共享库只是在运行时使用dlopen
和dlsym
链接,以便该应用程序链接时该库可能不存在于系统上?
大多数shared libraries需要在构建时和运行时都存在。请注意,共享库是而不是DLL(这是Windows的东西)。
我假设你的代码为Linux。其他操作系统的细节不同(而且它们很重要)。例如,如果您正在编译Qt应用程序,那么在构建应用程序和运行应用程序时都需要Qt共享库(如/usr/lib/x86_64-linux-gnu/libQt5Gui.so
等)。阅读关于动态链接器ld-linux.so(8) &约ELF。
但是您在询问plugins的dynamic loading(使用dlopen(3)与dlsym(3) ...)。 然后阅读莱文的Linkers & Loaders,Program Library HowTo,C++ dlopen mini HowTo和Drepper的How To Write Shared Libraries
参见this answer。
一些库和框架试图以操作系统中立的方式抽象插件的加载。阅读例如约Qt plugins支持,或约POCO shared libraries(名字不好,它是关于插件)。
你可以拥有它,它一切正常。
虽然与库目前在编译的时候,通过的dlopen /调用LoadLibrary显式的,而不是GET库,你可以使用所有的功能直接
如果在编译时指定,共享库将充当静态库,还是会在运行时动态链接? – Shuzheng
后者:动态运行时。 –
这里有一个窍门,以避免您在编译时的程序.so
文件:
您可以随时创建一个模拟C/C++接口,并将实现中的方法保留为空,然后在您使用该程序后再将它们链接起来。但是,在这种情况下,您必须明确地编译代码以创建空函数的共享库,然后再创建实现的库。
例如,在CMake中,您可以使用ADD_LIBRARY
添加将创建共享库的源代码。
ADD_LIBRARY(MyLibName SHARED empty1.cpp empty2.cpp -fPIC)
这将创建一个.so
文件,并与它链接程序最终当你与它连接你的可执行文件。在运行时,您可以选择任何您想要的.so
文件。
-fPIC
是创建“位置独立代码”的g ++标志,因此.so
库中的函数名称不会发生错位。
当然,这是您自己的库的选项,但不是您在外部使用的库,如Qt。除非你想嘲笑Qt库,这并不那么简单。
只需在本网站上搜索“未定义参考”的问题,就会发现有必要的情况。我会争论大多数人,手册'dlopen'是相当专业的用途。 – Mat
什么时候需要,什么时候不需要? – Shuzheng
尝试编译一段调用'dlopen',没有'-ldl'链接标志的代码。对于正常使用共享库来说,“几乎总是”是必要的。 – Mat