2

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

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

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

现在在LINUX中使用libdl in build函数---dlopen、dlsym、dlclose。
我们真的需要包含原型文件——ctest.h——用于动态库吗?

请给出与上述帖子相关的一些建议。

4

1 回答 1

1

您实际上不需要包含动态库的头文件或原型文件,但是您至少需要为dlsym.

有关不包含动态库的包含文件的示例,请参见此处此处。

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

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

头文件中包含的函数原型使得实现的函数可以由链接器按名称解析。作为共享对象文件,无论它是如何链接的,都包含链接器链接到的库的实现。

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

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

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

有关更多信息,请参阅以下相关StackOverflow 答案

更多信息可以在

于 2012-12-02T18:16:41.097 回答