Gcc 如何强制静态库中的符号包含在共享库生成中?

Gcc 如何强制静态库中的符号包含在共享库生成中?,gcc,shared-libraries,Gcc,Shared Libraries,我正在尝试构建一个共享对象库,该库将由使用dlopen()的程序打开。此库将使用一个单独的静态库提供的功能 在链接动态库时,我已经在链接行中包含了适当的标志以拉入静态库(例如,对于libfoo.a,我有-lfoo),链接器不会抱怨。但是,当主程序在动态库上调用dlopen()时,调用将失败,并显示一条“undefined symbol”消息,该消息引用了来自静态库的符号 运行nm确实表明所讨论的符号在动态库中未定义,并且主程序不包含它,因此如何强制链接器将此符号拉入?符号本身位于未初始化的数据部

我正在尝试构建一个共享对象库,该库将由使用dlopen()的程序打开。此库将使用一个单独的静态库提供的功能

在链接动态库时,我已经在链接行中包含了适当的标志以拉入静态库(例如,对于libfoo.a,我有-lfoo),链接器不会抱怨。但是,当主程序在动态库上调用dlopen()时,调用将失败,并显示一条“undefined symbol”消息,该消息引用了来自静态库的符号

运行nm确实表明所讨论的符号在动态库中未定义,并且主程序不包含它,因此如何强制链接器将此符号拉入?符号本身位于未初始化的数据部分(nm输出中的符号类型“B”)。

链接器选项应执行此操作。你会用它作为例子

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib
您所经历的是,默认情况下,链接器将在静态存档中搜索您生成的二进制文件所需的符号,如果需要,它将包括符号所在的整个.o。如果您的共享库不需要任何符号,它们将不会包含在您的共享库中


请记住,成为共享库的代码需要使用特殊选项进行编译,例如
-fpic
,当您在共享库中包含静态库时,静态库需要使用相同的选项进行编译。

最近我正在搜索相同的解决方案。 我发现使用

--undefined=symbol


解决了这个问题。

另一个技巧是在库初始化期间将函数的地址带到某个地方。这将确保您实际使用该符号。

答案将把存档中的所有符号转换为共享库中的导出符号。如果你只需要一个符号,这个答案会在你的大脑中产生更少的浮肿。
-u symbol