便利库中的符号不​​能以可执行文件导出

我有一个程序myprogram ,它与一个静态便利库链接,称之为libconvenience.a ,其中包含一个函数func() 。 函数func()myprogram任何地方都没有调用。 它需要能够从插件库plugin.so

符号func()不会在myprogramdynamic导出。 如果我跑

 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() ,那么func()也会出现在myprogram的符号中。 但是我认为--export-dynamic应该导出所有符号,不pipe它们是否在程序中使用!

我在Fedora 14上使用automake 1.11.1和gcc 4.5.1。我也使用Libtool 2.2.10构buildplugin.so (但不是便利库)。

我没有忘记在myprogram_LDFLAGSlibconvenience_a_SOURCES -Wl,--export-dynamic ,也没有忘记在libconvenience_a_SOURCES放置包含func()的源代码(有些Googlesearch表明这些是这个问题的常见原因)。

有人能帮我理解这里发生了什么吗?

Solutions Collecting From Web of "便利库中的符号不​​能以可执行文件导出"

我设法解决它。 这是John Calcote的优秀Autotools书的这个笔记,指出了我的正确方向:

连接器向二进制产品添加了在命令行上显式指定的每个对象文件,但是它们仅从存档中提取在被链接的代码中实际引用的那些对象文件。

为了抵消这种行为,可以使用--whole-archive标志来进行libtool。 但是,这导致所有系统库中的所有符号都被拉入,导致大量的双符号定义错误。 所以--no-whole-archive需要在链接器命令行上的libconvenience.a之前,并且需要在--no-whole-archive之后加上--no-whole-archive这样其他的库不会被这样处理。 这是有点困难,因为automake和libtool并不能保证你的标志在命令行上保持相同的顺序,但是Makefile.am中的这一行确实有效:

 myprogram_LDFLAGS = -Wl,--export-dynamic \ -Wl,--whole-archive,libconvenience/libconvenience.a,--no-whole-archive 

如果你需要func在plugin.so,你应该尝试在那里找到它,如果可能的话。 便利库仅仅是为了方便链接到可执行文件或lib作为中间步骤。