动态共享库 - 用于linux

时间:2012-12-02 16:48:59

标签: linux-device-driver embedded-linux

我只有一个与Linux共享库文件有关的问题。

我看到很多与Linux O.S动态共享库相关的链接 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

在上面的链接中提到--- 包含库的文件:ctest.h

现在在LINUX中使用构建函数中的libdl --- dlopen,dlsym,dlclose。
我们真的需要包含原型文件--ctest.h - 用于动态lybrary吗?

请提供一些与上述帖子有关的建议。

1 个答案:

答案 0 :(得分:1)

您实际上不需要包含动态库的头文件或原型文件,但您至少需要dlsym返回的值的特定类型信息。

有关不包含动态库的包含文件的示例,请参阅herehere

在你发布的例子中,他们开始使用他们的库函数没有头文件/函数原型,这提供了如何避免C ++名称修改的说明,这就是他们在这种情况下包含头文件的原因。

如果您在源文件或头文件中定义了没有函数原型的库,那么在使用dlsym时需要包含头文件,否则包含动态头文件库是不必要的,因为它的函数原型已经包含在生成的共享对象中。

头文件中包含的函数原型是可以通过链接器按名称解析实现的函数。无论链接方式如何,共享对象文件的位置都包含链接器链接到的库的实现。

简短的解释是,#include包含的头文件由预处理器处理,这意味着传递给链接器的结果源文件/文件知道每个函数调用的对象是因为它查找了函数调用原型,它位于包含文件中,并已包含在修改后的源代码中。包含文件告诉链接器函数调用。

目标文件,共享对象文件和其他库文件告诉链接器什么函数调用原型的实现。

要在评论中回答您的问题,您只需将libdl.so路径添加到LD_LIBRARY_PATH或添加到/etc/ld.so.conf并运行ldconfig,如果该库或其相关符号链接层次结构不在标准位置,例如/usr/lib//lib/

有关详细信息,请参阅以下相关StackOverflow answer答案。

更多信息可在

找到