共享库(.so)文件是否需要在链接时显示(或指定)?
我在这里(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?)读到.so文件必须在编译时出现,但根据我的经验,这不是真的吗?
共享库是否只是在运行时使用dlopen
和dlsym
进行链接,以便在链接应用程序时系统中可能没有库?
答案 0 :(得分:3)
大多数shared libraries需要在构建时和运行时都存在。请注意,共享库不是 DLL s(这是Windows的事情)。
我假设您为Linux编写代码。其他操作系统的细节也不同(并且它们很重要)。
例如,如果您正在编译Qt应用程序,那么在构建应用程序和运行应用程序时,您都需要Qt共享库(例如/usr/lib/x86_64-linux-gnu/libQt5Gui.so
和许多其他库)。阅读动态链接器ld-linux.so(8)&关于ELF。
但您要问dynamic loading dlopen(3) {使用dlsym(3)与plugins ...)Linkers & Loaders。 然后阅读Levine的Program Library HowTo,C++ dlopen mini HowTo,How To Write Shared Libraries和Drepper的this answer
另见Qt plugins。
一些库和框架尝试以OS中立的方式抽象插件的加载。阅读例如关于POCO shared libraries支持,或约(名称不详,是关于插件)。
答案 1 :(得分:-1)
你可以双管齐下,一切正常。
虽然库在编译时出现,而不是通过dlopen / LoadLibrary明确获取库,但您可以直接使用所有函数