2010-06-09 131 views
1

- 我试图创建一个共享对象libfoo.solibfoo.so创建自foo.c - 假设我包含头文件static.hDynamic.h,其中我希望编译器能够为
解析Static.h的符号,并保留其余部分,即从Dynamic.h运行时留下。 - 我该怎么做?什么是我需要通过的CFLAG和LDFLAG选项。 - 我的makefile被设置为使用CFLAGS = fPIC,共享的W1,导出动态来创建一个共享对象。 - 在包含路径中指定“Static.h”的正确位置GCC/C++共享对象中标题的静态链接

有人可以帮我吗?

+1

'static.h'中的符号来自哪里?另一个库? – 2010-06-09 17:16:51

+0

不,他们不来自另一个图书馆。我“期待”他们应该来自static.cc的目标代码。我已经提供了正确的包含路径,并希望编译器从那里得出结论。 – 2010-06-09 19:52:58

回答

0

我相信你所描述的功能实际上是你用GCC链接程序免费获得的。在链接过程中,链接程序将解析您的代码引用到在命令行上传递给它的库的所有符号。如果引用的符号名称包含在一个静态库(.a文件)中,它将被“静态”链接,并且如果该符号位于动态链接库(.so文件)中,它将在程序中动态链接执行时间处理时间。

一般而言,您不需要关心您的符号是静态还是动态链接,因为它应该对您的C/C++代码没有任何影响。从您的描述中,很难理解您的问题的动机,但您可能需要通过系统调用dlopen()明确加载动态链接库。如果第一段没有回答你的问题,你能描述一下你试图解决的一般问题吗?

+0

感谢您的回复。 我正在扩展一个snmp代理并编写* .so对象来提供扩展功能。 生成文件的摘要 CFLAGS + = $(INCDIRS)-shared -fPIC CFLAGS + = FNO严格混叠 LDFLAGS + =出口动态 SHLIB1 = SomeName.so SHLIB1_SRCS = foo.c的 和一堆通用于系统的makefile宏。 – 2010-06-09 19:58:55

+0

我一直在看 dlopen失败:/SomeDir/lib/ifTable.so:undefined symbol:_ZN15SomeRecord4initER14TransactionRep 而这个的源头是我包含的头文件。一旦我删除特定的头文件,我没有看到这个消息。 – 2010-06-09 20:09:32

+0

通常'未定义的符号'表示你忽略与所需的库链接。找出哪个.so文件定义该符号(以及因此链接的符号)的一种方法是在.so上运行以下命令,该命令可能包含缺少的符号:'objdump -t .so | grep SomeRecord4init' – Rakis 2010-06-09 20:15:31

1

dlopen(),dlclose(),dlsym(),dlerror()是否有用于打开外部运行时库的信息。 您必须声明这些外部对象的函数指针,然后在运行时解析它们。

如果您只是在代码中保留引用“裸”,链接器将尝试解析该符号。它会解决它或抛出一个错误,从而不会得到一个executabel图像。我不知道有任何链接器选项可排除尝试链接未解析的符号。

或者我没有得到你想要做的。

+1

它是'dlclose'而不是'dlfree' – 2015-09-03 08:14:22

+0

是的,谢谢你的纠正。 – 2015-09-03 19:58:13

0

只要所有的动态符号都在相应的头文件中(通过extern)考虑,但可能未声明,则在应用程序加载并定义符号时,运行时链接程序可以在稍后的时间点覆盖它们,如果缺少一个或多个符号(如上面已经用SomeRecord4init报告的那样),则运行时链接程序将填充缺失的位或可执行文件上的barf。您也可以将您的应用程序与库(而不是使用libdl,这是一种痛苦,通过许多常见的构建/分析工具来追踪lib依赖关系)相关联。只要在CFLAGS中使用-shared而不是-static就可以做到这一点。

许多项目虽然在C库中定义了面向私有和公共的API和字段。也许这就是你应该怎么做来解决这个问题?

+0

还有弱符号与强符号的关系,但我故意掩盖了这一点。 – yaneurabeya 2010-06-09 22:46:21

相关问题