2009-11-05 76 views
0

我想通過構建一個靜態庫來公開一個定義良好的類,然後將構建的庫與幾個定義該類的頭文件以及使用它所需的接口一起發送。我有這個工作,但我遇到的問題是圖書館是巨大的。它具有整個項目中的每個對象文件,我需要的只是一個子集。如果我製作一個簡單的main.cpp文件幷包含並使用那個單獨的類,那麼我得到的輸出文件只有我使用的庫的20%。有沒有辦法告訴鏈接器從一個給定的地方開始並修剪其他所有的東西,比如在可執行的情況下?在C++中修剪靜態庫

編輯:我忘了提,我使用Cygwin和Linux的海灣合作委員會(雖然我想與Visual Studio的工作,以及解決方案,我們一般利用它來進行開發,但部署主要是在Linux上)

回答

0

製作共享庫。它從鏈接等角度看起來像一個可執行文件。它應該執行你提到的在可執行文件中看到的丟棄。

+0

是的,這可能是最好的解決方案,我仍然需要弄清楚如何導出我想要的符號,但是在快速搜索Google比較直截了當。謝謝! –

0

你必須把項目分開。取出庫所需的文件,並創建一個單獨的項目來構建庫。

剩下的項目(帶有main.cpp)需要調用新的lib項目來獲取lib 細節取決於你用來管理項目的工具和操作系統(例如Visual Studio或者make或者... )

+0

讓我感到惱火的是,它在構建可執行文件時做了我期望的事情,顯然,修剪未使用的類的邏輯在那裏。我覺得它只是需要提示什麼需要被暴露。 –

+0

static libs不使用鏈接器,而只是將所有對象文件連接在一起,而不是更多 – Mark

0

你還沒有告訴我們你正在使用什麼工具鏈,但既然你說了項目,我猜你正在使用MS工具鏈。

MS工具鏈將項目中的每個對象都包含到靜態庫中。你想要做的是將你的單個課程分成一個單獨的項目。您可以繼續擁有包含該類的超級項目,因此您不必修改任何現有項目。

現在,如果您想將其提升到下一個級別,您應該考慮將該類的每個成員放入其自己的翻譯單元(即.cpp文件)。這樣,如果一個類的用戶只需要類的幾個部分,他們只需要鏈接他們需要的部分。