我有一个程序叫做
在
如果我在
myprogram
,它链接了一个静态便捷库libconvenience.a
,其中包含一个名为func()
的函数。但是myprogram
中没有调用func()
函数;func()
需要能够从插件库plugin.so
中被调用。在
myprogram
中,符号func()
没有被动态导出。如果我运行以下命令:nm myprogram | grep func
我什么也没有得到。然而,libconvenience.a
中并没有缺失:
nm libconvenience/libconvenience.a | grep func
00000000 T func
我正在使用 automake,但是如果我手动在命令行上执行最后的链接步骤,它也不起作用:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`
然而,如果我像这样链接程序,跳过使用便利库并直接链接本应进入libconvenience.a
的目标文件,func()
将如预期地出现在 myprogram
的符号中:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`
如果我在
myprogram
中的任何位置添加一个虚拟调用func()
,那么func()
也会显示在myprogram
的符号中。但是,我认为--export-dynamic
应该导出所有符号,无论它们是否在程序中使用!我正在Fedora 14上使用automake 1.11.1和gcc 4.5.1。我还使用Libtool 2.2.10构建plugin.so
(但不使用方便库)。我没有忘记将-Wl,--export-dynamic
放入myprogram_LDFLAGS
中,也没有忘记将包含func()
的源代码放入libconvenience_a_SOURCES
中(一些搜索表明这些是此问题的常见原因)。有人可以帮助我理解这里发生了什么吗?
cc_library(alwayslink=True)
。 - FDS