- 我正在尝试创建一个共享对象libfoo.so
。 libfoo.so
是从foo.c
创建的
- 假设我将头文件static.h
和Dynamic.h
包含在我想要编译器的地方
解析Static.h的符号,剩下的就是来自Dynamic.h的运行时。
- 我该怎么做呢 ?我需要通过哪些CFLAG和LDFLAG选项。
- 我的makefile设置为使用CFLAGS = fPIC,shared,W1,export-dynamic创建共享对象。
- 在包含路径中i指定“Static.h”的正确位置
有人能帮助我吗?
答案 0 :(得分:1)
dlopen(),dlclose(),dlsym(),dlerror()可供您打开外部运行时库。 您必须声明这些外部对象的函数指针,然后在运行时解析它们。
如果您只是在代码中留下引用“bare”,链接器将尝试解析该符号。它将解决它或抛出一个错误,你不会得到一个executabel图像。我不知道有任何链接器选项可以排除尝试链接未解析的符号。
或者我没有得到你想做的事。
答案 1 :(得分:0)
我相信您所描述的功能是您通过GCC链接器免费获得的功能。在链接过程中,链接器将解析代码引用的所有符号,这些符号是在命令行上传递给它的库。如果引用的符号名称包含在静态库(.a文件)中,则它将“静态”链接,如果符号位于动态链接库(.so文件)中,则它将在程序中动态链接执行时间。
一般来说,您不必关心您的符号是静态链接还是动态链接,因为它应该对您的C / C ++代码没有任何影响。根据您的描述,您很难理解问题的动机,但您可能需要通过dlopen()
系统调用显式加载动态链接库。如果第一段没有回答你的问题,你能描述一下你试图解决的一般问题吗?
答案 2 :(得分:0)
只要所有动态符号都在相应的头文件中(通过externs)进行计算,但可能没有声明,当应用程序加载并定义符号时,运行时链接程序可以在以后的时间点覆盖它们,如果缺少一个或多个符号,则运行时链接程序会填充缺少的位或可执行文件上的barf(就像上面使用SomeRecord4init报告的那样)。
您还可以将应用程序与库链接(而不是使用libdl,这很难通过许多常见的构建/分析工具来跟踪lib依赖项)。只需在你的CFLAGS中使用-shared和not -static即可。
许多项目定义了面向私有和公共的API和字段,尽管在C中用于库。也许这就是你应该做些什么来解决这个问题?