2016-11-22 124 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編譯。任何指針進一步調試? –

相關問題