您并不需要包含动态库的头文件或原型文件,但是您至少需要dlsym
返回的值的特定类型信息。对于不包含动态库的包含文件的示例,请参见here和here。
在你发布的例子中,他们的库函数没有头文件/函数原型,并且提供了有关如何避免C++名称变形的说明,这就是为什么他们在这种情况下包含头文件的原因。
如果您定义自己的函数库没有函数原型,无论是源文件还是头文件,那么在使用dlsym
时需要包含头文件,否则不需要包含动态库的头文件因为它的函数原型已经包含在生成的共享对象中。
包含在头文件中的函数原型使得实现的函数可以由链接器按名称解析。作为共享对象文件,无论链接如何,都包含链接器链接到的库的实现。
简单的解释是,#include
包含的头文件由预处理器处理,这意味着传递给链接器的结果源文件/文件知道每个函数调用是谁,因为它查找函数调用原型在包含文件中,并且已包含在修改后的源代码中。包含文件告诉链接器关于谁的函数调用是。
对象文件,共享对象文件和其他库文件告诉链接器有关什么函数调用原型的实现。
要在注释中回答您的问题,只需将libdl.so
路径添加到LD_LIBRARY_PATH
或/etc/ld.so.conf并运行ldconfig,如果该库或其相关的符号链接层次结构不在标准位置,如/usr/lib/
或/lib/
。
有关更多信息,请参阅以下相关StackOverflow answer答案。
的更多信息可以在
感谢appleman1234找到。只需使用另一件事---构建函数中的libdl --- dlopen,dlsym,dlclose。 -----我们是否需要为加载器添加以下路径... LD_LIBRARY_PATH或ldconfig? – user1870619