2012-05-03 90 views
1

在我的C++應用程序中,我有一個鏈接到boost庫的靜態庫(libCOMMON.a):system,filsystem,timer和chrono。將動態庫鏈接到鏈接到其他靜態庫的靜態庫

我使用CMake和這裏是如何創建和鏈接libCOMMON.a:

ADD_LIBRARY(COMMON ${COMMON_SRCS}) 
target_link_libraries(COMMON 
    ${BOOST_LIB_DIR}/libboost_filesystem.a 
    ${BOOST_LIB_DIR}/libboost_system.a 
    ${BOOST_LIB_DIR}/libboost_timer.a 
    ${BOOST_LIB_DIR}/libboost_chrono.a 
) 

我也有這個應用程序鏈接到libCOMMON.a插件。這些插件被構建爲動態庫。一切都編譯好(使用gcc),但是當我啓動應用程序時,無法加載插件,因爲與boost相關的動態庫中的某些符號無法解析。

解決方案是鏈接每個插件來提升。有沒有更好的辦法 ? 我認爲如果boost庫靜態鏈接到libCOMMON.a中,將插件鏈接到libCOMMON.a就足夠了。

有人可以解釋發生了什麼?

感謝

+0

可以顯示用於生成libCOMMON.a的命令嗎?有幾種方法可以解決這個問題。 – Flexo

+0

我使用CMake來做到這一點:ADD_LIBRARY(COMMON $ {COMMON_SRCS})。我編輯了這個問題並添加了更多細節。 – nbilal

+0

靜態庫不能「鏈接到」其他靜態庫。靜態庫只是對象文件的集合。沒有任何機制可以引用其他庫。你可以從幾個小型圖書館中創建一個大型圖書館,但這對於重複信息是毫無意義的練習。 –

回答

0

我認爲這個問題是Boost庫被構建爲默認的動態庫。即使「.a」表明它們是作爲靜態庫構建的,boost的lib文件夾也包含一個帶有「.a」的「.so」庫。這意味着libCOMMON.a會動態鏈接到boost庫。出於這個原因,靜態鏈接到libCOMMON.a的插件也可以動態鏈接到boost庫。更好的解決方案是將boost庫建立爲靜態庫。