2012-12-15 34 views
4

我在C應用程序中使用了GSL庫的一些功能。這個圖書館非常大,有很多功能和設施,我只想要其中的幾個。我的問題是我想在一個小型嵌入式系統上使用我的應用程序,並使用這個大型庫使我編譯的應用程序如此之大。從大型C庫中創建子集

是否有任何工具從這樣的大型庫中提取函數和文件的特定子集?

謝謝大家提前,

+6

如果你只需要在一個應用程序中使用它,你可以靜態鏈接它(也許你已經這樣做了,因爲有關使應用程序本身大的評論)並使用工具鏈選項去除不需要的代碼。 –

+0

如果您使用的是gcc,並且您可以訪問庫源代碼,則可以嘗試啓用鏈接時優化。這基本上會刪除所有不需要的代碼,並且執行更好的內聯。與-Os結合可獲得更好的結果。 – fuz

+0

嘗試僅包括您需要的標題,而不是每個gsl標題,並按Chris Stratton的說法 – pyCthon

回答

1

您可以實際使用mklibs:https://launchpad.net/mklibs

它能夠剝奪你的共享庫的未使用的部分,基於依賴於該庫一組bexecutable的。

你甚至不必擁有你的庫的代碼。

0

如果你可以修改GLS庫,你可以嘗試做一個縮小版本。

最好的方法是使用像doxygen這樣的工具來生成呼叫者/被調用者圖表,並且僅挑選使用和需要的東西。可能你也可能會忽略一些依賴項(例如日誌記錄,管理狀態,你不需要的選項)。

但是,這種方法將需要大量的工作。但是,如果你在一個小型嵌入式系統上,那麼「超薄版本」可能沒有那麼多代碼行,所以挑選櫻桃可能是合理的。

5

是否有任何工具從這樣的大型庫中提取函數和文件的特定子集?

是的 - 這是鏈接器已經做的。

庫是一個集合,如果單個對象代碼文件。鏈接器將僅鏈接實際解析代碼中引用所需的那些對象文件。只要圖書館設計人員充分利用了圖書館粒度(理想情況下每個對象文件一個公共函數),那麼您鏈接的應用程序代碼將根本不會與庫的大小相關,只有您明確指定的代碼總和引用。

所以我的建議是先構建代碼,然後看看你是否真的有問題 - 有可能你沒有。請記住,您的應用程序可能已經鏈接了標準C庫,並且它本身並不會使您的應用程序成爲整個庫的大小!

鏈接器將能夠輸出一個MAP文件,該文件將詳細描述鏈接的目標代碼以及它們中的函數和數據對象。您將能夠確定鏈接的有效性 - 請記住,雖然您調用的函數可能會調用庫中的其他函數,但您尚未明確引用它們。您的鏈接器也可以輸出詳細說明這種依賴關係的交叉引用表。