问题描述
我有一个程序, code>(有些谷歌搜索表明,这些是这个问题的常见原因。)
有人可以帮我理解这里发生了什么吗?
我设法解决了这个问题。这是John Calcote出色的Autotools书籍的说明,它指出了我的正确方向:
$ b
抵消这种行为,可以使用 - whole-archive 标志来进行libtool。但是,这会导致所有系统库中的所有符号都被拉入,导致大量双符号定义错误。因此, - whole-archive 需要在链接器命令行上的 libconvenience.a 之前,它需要后面紧跟着 - no-whole-archive ,以便其他库不以那种方式处理。这有点困难,因为automake和libtool并不能真正保证你的标志在命令行上保持相同的顺序,但是 Makefile.am 中的这一行做到了这一点:
myprogram_LDFLAGS = -Wl, - export-dynamic \
-Wl, - whole-archive,libconvenience /libconvenience.a,-no-whole-archive
I have a program, myprogram, which is linked with a static convenience library, call it libconvenience.a, which contains a function, func(). The function func() isn't called anywhere in myprogram; it needs to be able to be called from a plugin library, plugin.so.
The symbol func() is not getting exported dynamically in myprogram. If I run
nm myprogram | grep func
I get nothing. However, it isn't missing from libconvenience.a:
I am using automake, but if I do the last linking step by hand on the command line instead, it doesn't work either:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`
However, if I link the program like this, skipping the use of a convenience library and linking the object files that would have gone into libconvenience.a directly, func() shows up in myprogram's symbols as it should:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`
If I add a dummy call to func() somewhere in myprogram, then func() also shows up in myprogram's symbols. But I thought that --export-dynamic was supposed to export all symbols regardless of whether they were used in the program or not!
I am using automake 1.11.1 and gcc 4.5.1 on Fedora 14. I am also using Libtool 2.2.10 to build plugin.so (but not the convenience library.)
I didn't forget to put -Wl,--export-dynamic in myprogram_LDFLAGS, nor did I forget to put the source that contains func() in libconvenience_a_SOURCES (some Googling suggests that these are common causes of this problem.)
Can somebody help me understand what is going on here?
I managed to solve it. It was this note from John Calcote's excellent Autotools book that pointed me in the right direction:
To counteract this behavior, one can use the --whole-archive flag to libtool. However, this causes all the symbols from all the system libraries to be pulled in also, causing lots of double symbol definition errors. So --whole-archive needs to be right before libconvenience.a on the linker command line, and it needs to be followed by --no-whole-archive so that the other libraries aren't treated that way. This is a bit difficult since automake and libtool don't really guarantee keeping your flags in the same order on the command line, but this line in Makefile.am did the trick:
myprogram_LDFLAGS = -Wl,--export-dynamic \ -Wl,--whole-archive,libconvenience/libconvenience.a,--no-whole-archive
这篇关于便利库中的符号不能以可执行文件导出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!