2017-02-03 74 views
2

共享库(.so)文件需要在链接时呈现(或指定)吗?共享库(.so)文件需要在链接时呈现(或指定)吗?

我读过这里(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须出现在编译时,但根据我的经验,这是不正确的?

没有共享库只是在运行时使用dlopendlsym链接,以便该应用程序链接时该库可能不存在于系统上?

+0

只需在本网站上搜索“未定义参考”的问题,就会发现有必要的情况。我会争论大多数人,手册'dlopen'是相当专业的用途。 – Mat

+0

什么时候需要,什么时候不需要? – Shuzheng

+1

尝试编译一段调用'dlopen',没有'-ldl'链接标志的代码。对于正常使用共享库来说,“几乎总是”是必要的。 – Mat

回答

3

大多数shared libraries需要在构建时和运行时都存在。请注意,共享库是而不是DLL(这是Windows的东西)。

我假设你的代码为Linux。其他操作系统的细节不同(而且它们很重要)。例如,如果您正在编译Qt应用程序,那么在构建应用程序和运行应用程序时都需要Qt共享库(如/usr/lib/x86_64-linux-gnu/libQt5Gui.so等)。阅读关于动态链接器ld-linux.so(8) &约ELF

但是您在询问pluginsdynamic loading(使用dlopen(3)dlsym(3) ...)。 然后阅读莱文的Linkers & LoadersProgram Library HowToC++ dlopen mini HowTo和Drepper的How To Write Shared Libraries

参见this answer

一些库和框架试图以操作系统中立的方式抽象插件的加载。阅读例如约Qt plugins支持,或约POCO shared libraries(名字不好,它是关于插件)。

+0

那么,共享库是否可以用于动态加载?是否必须在链接时指定.so文件,以便程序明确引用调用中的函数,而不是间接使用dlopen()? – Shuzheng

+0

您需要阅读我提供给您的所有参考资料(并且您需要一周以上才能阅读所有内容)。细节是特定于操作系统的。 –

+0

谢谢,我会的! – Shuzheng

0

你可以拥有它,它一切正常。

虽然与库目前在编译的时候,通过的dlopen /调用LoadLibrary显式的,而不是GET库,你可以使用所有的功能直接

+0

如果在编译时指定,共享库将充当静态库,还是会在运行时动态链接? – Shuzheng

+0

后者:动态运行时。 –

0

这里有一个窍门,以避免您在编译时的程序.so文件:

您可以随时创建一个模拟C/C++接口,并将实现中的方法保留为空,然后在您使用该程序后再将它们链接起来。但是,在这种情况下,您必须明确地编译代码以创建空函数的共享库,然后再创建实现的库。

例如,在CMake中,您可以使用ADD_LIBRARY添加将创建共享库的源代码。

ADD_LIBRARY(MyLibName SHARED empty1.cpp empty2.cpp -fPIC) 

这将创建一个.so文件,并与它链接程序最终当你与它连接你的可执行文件。在运行时,您可以选择任何您想要的.so文件。

-fPIC是创建“位置独立代码”的g ++标志,因此.so库中的函数名称不会发生错位。

当然,这是您自己的库的选项,但不是您在外部使用的库,如Qt。除非你想嘲笑Qt库,这并不那么简单。