2016-11-22 122 views
0

我遇到了一个有趣的问题。我正在编译我的应用程序代码,并在我的centos 6机器上使用了ace库(版本6_1_1。一切正常。当我在看的王牌库在CentOS 6机编译的符号,它看起来像这样:Centos中未定义的符号错误编译

bash-4.1$ nm ace/libACE.so.6.1.1 | grep handle_sig 000f9430 T _ZN15ACE_Sig_Adapter13handle_signalEiP7siginfoP8ucontext 000b84d0 T _ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext 00079f10 T _ZN18ACE_Service_Config13handle_signalEiP7siginfoP8ucontext 000f26d0 T _ZN19ACE_Process_Manager13handle_signalEiP7siginfoP8ucontext 0007ee70 T _ZN19ACE_Service_Manager13handle_signalEiP7siginfoP8ucontext 000cf920 T _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP7siginfoP8ucontext 000f8b80 T _ZN22ACE_Shared_Memory_Pool13handle_signalEiP7siginfoP8ucontext bash-4.1$

但是当我编译在同一个项目上CentOS的7机,符号改变:

bash# nm ace/6_1_1/ace/libACE.so.6.1.1 | grep handle_sig 000fa090 T _ZN15ACE_Sig_Adapter13handle_signalEiP9siginfo_tP8ucontext 000b9570 T _ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext 0007e070 T _ZN18ACE_Service_Config13handle_signalEiP9siginfo_tP8ucontext 000f3500 T _ZN19ACE_Process_Manager13handle_signalEiP9siginfo_tP8ucontext 00081cb0 T _ZN19ACE_Service_Manager13handle_signalEiP9siginfo_tP8ucontext 000d1990 T _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP9siginfo_tP8ucontext 000f93d0 T _ZN22ACE_Shared_Memory_Pool13handle_signalEiP9siginfo_tP8ucontext bash#

请注意siginfo中还有一个额外的_t。所以,我的应用程序,它链接这个库无法在运行时推出给我的错误:

symbol "_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext" not found

另一个有趣的一点要注意的是,如果我6盒复制编译ACE库从我的CentOS进入的CentOS 7盒,我的申请工作正常。

我迷失在如何解决这个问题。任何在这方面的帮助将不胜感激!

回答

0

But when i compile the same project on centos 7 machine, the symbols change:

可能的Glibc在CentOS 7已经改变了公众头的类型造成压榨机发出不同的符号之一:

$ echo _ZN15ACE_Sig_Adapter13handle_signalEiP7siginfoP8ucontext | c++filt 
ACE_Sig_Adapter::handle_signal(int, siginfo*, ucontext*) 
$ echo _ZN15ACE_Sig_Adapter13handle_signalEiP9siginfo_tP8ucontext | c++filt 
ACE_Sig_Adapter::handle_signal(int, siginfo_t*, ucontext*) 

注意,新的方法现在使用siginfo_t而非SIGINFO(你会如果你是谷歌的“siginfo_t vs siginfo”),你可以看到数百个投诉。

Another interesting point to note is that if i copy the compiled ace library from my centos 6 box into centos 7 box, my application works fine.

这是向后兼容 - 在旧版本上发行的,你可以(通常)连接运行的应用程序的新版本。

相反,无法保证向前兼容性(在您的情况下 - 将旧应用程序与新库链接)。

I am lost on how to fix this issue.

如果您只对新的CentOS感兴趣 - 重建所有代码。如果你想在旧版本上运行 - 建立在最旧的版本上并分发它。

+0

感谢您回复。我一直在编译新的CentOS本身的应用程序和库,即Centos 7.2。正如你在上面指出的那样,当我在Centos 6和Centos 7上编译它时,这些符号是不同的。我也使用最新的glibc编译。任何指针进一步调试? –

相关问题