2016-06-20 43 views
1

我有一個使用boost記錄庫的Qt應用程序。我想讓它成爲獨立的。但是,在我管理靜態鏈接的庫之後,應用程序仍依賴於boost庫。 我包括的庫是:Boost Logger靜態鏈接:不工作

..../boost_1_61_0_b1/stage/lib/libboost_regex.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log_setup.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_thread.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_system.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_filesystem.a 

應用編譯(無數嘗試之後)。但是,當我使用ldd工具時,它顯示依賴項列表上的boost庫。

注意:我必須定義BOOST_ALL_DYN_LINK。否則,它不會鏈接。

有沒有辦法不使用這個宏並克服依賴性問題?如果不是,你建議採取什麼解決方案來解決這個問題?

+1

首先將所有boost庫編譯爲靜態庫。我很確定你可以使用一個bjam選項。 –

+0

但是我在/ stage/libs下同時安裝了.a和.so文件。我應該把它們分開嗎? –

回答

0

默認情況下,在現代類UNIX系統中默認情況下gcc與共享庫鏈接。爲了強制靜態鏈接,您可以將-static添加到鏈接命令行(請參閱docs),或者確保gcc找不到共享庫,但僅查找靜態庫(例如,將共享庫移動到單獨的目錄'重新鏈接你的項目)。請注意,-static將使所有庫靜態鏈接,包括libstdC++。

或者,您可以直接指定靜態庫,而不使用-l開關。你將不得不雖然使用的完整路徑庫,所以不是

gcc ... -lboost_log ...

你會寫

gcc ... ..../boost_1_61_0_b1/stage/lib/libboost_log.a ...

在任何情況下,你應該定義BOOST_ALL_DYN_LINK,因爲這個宏意味着完全相反 - 你打算鏈接升壓共享圖書館。

+0

我試過bjam -static然後我鏈接到.a庫,它工作。我不知道這是一個Qt .pro問題還是什麼,但似乎當同一路徑中同時存在.a和.so庫時,即使指定了其他庫,它也會鏈接到.so。不管怎麼說,多謝拉 –