2012-06-27 55 views
0

我使用log4cxx日誌庫。我需要鏈接到它的靜態版本,以避免額外的二進制依賴。我在我的動態庫中使用它。 log4cxx的默認構建生成靜態庫,但我無法鏈接它,因爲它是用w/o -fPIC標誌編譯的。如何正確構建靜態庫?

CPPFLAGS="-fPIC -static" ./configure 
make 

結果我收到了liblog4cxx.a,我可以用我的.so庫鏈接:所以當我改變log4cxx BULDING。鏈接由Cmake完成,如下所示:

target_link_libraries(my_dynamic_lib log4cxx) 
link_directories(relative_path_to_dir_where_liblog4cxx.a_lives) 

一切看起來都很好,直到運行時。我無法加載my_dynamic_lib.so,因爲undefined symbol "logger"

請解釋我有什麼問題以及如何解決此問題。

感謝

+0

嗨, 你確定庫liblog4cxx.a有記錄器符號定義嗎?我不知道你在使用什麼操作系統,但是如果你使用Linux,試試這個命令來檢查問題出在這個庫或其他地方: nm liblog4cxx.a | grep「logger」 這應該輸出在該庫上定義的符號名稱上有記錄器的符號。檢查記錄器是否被定義,符號類型(不應該是U - >未定義)。 –

回答

1

您可以驗證共享庫是否包含符號,如果此行顯示與符號類型U這意味着它是不確定的使用

nm -g my_dynamic_lib.so | grep logger 

通常共享庫不會解析所有需要的符號直到運行時,所以有可能(並且完全正常)將共享庫鏈接到缺少的符號。

如果你把-llog4cxx在爲my_dynamic_lib.so器命令行的開始,那麼它不會鏈接到任何代碼在那裏,將離開logger符號懸而未決,直到運行時。要強制其使用符號靜態庫確保您列出靜態庫後需要它的對象:

g++ -fPIC -shared -o my_dynamic_lib.so obj1.o obj2.o -llog4cxx ... 

我不知道該怎麼做,與cmake的,但它看起來儘管當鏈接主可執行文件時,您的CMakefile鏈接到log4cxx,而不是動態庫。

1

一般你會鏈接liblog4cxx.a與您的可執行文件,而不是您my_dynamic_lib.so。我不認爲你可以像你的例子那樣鏈接,除非你可以提供其他文檔。