2011-07-12 95 views
4

當建立一個目標文件(lib*.o)時,有沒有什麼辦法告訴編譯器(gcc/mingw32)只暴露.c文件中的某些函數?
我想這樣做的原因是我靜態鏈接到一個100,000+線庫(SQLite),但我只使用它提供的少數功能。我希望如果我能告訴編譯器只公開這些函數,它會優化出那些我選擇的那些從不需要的函數的所有代碼,從而縮小庫的大小。靜態庫「接口」

回答

1

我發現了幾種可能的解決方案:

這就是我問到的。這是gcc相當於Windows的dllexpoort的:

我還發現鏈接時代碼生成。這允許鏈接器查看代碼的哪些部分實際使用並擺脫其餘部分。與strip-fwhole-program一起使用,給了我更好的結果。

注:此標誌纔有意義,如果你不是在一個調用gcc的,這是我在做什麼編譯整個程序(使一個sqlite.o文件,然後靜態鏈接它)。

第三個選項,我發現但尚未看着這裏提到:

0

這可能是連接器的工作,而不是編譯器。當把它作爲一個程序(.exe)鏈接時,鏈接器將只處理導入相關的符號,並且當鏈接一個DLL時,__dllexport機制可能就是你正在尋找的,或者一些ld的標誌可以幫助你(man LD)。

+0

我使用'.so'文件,而不是DLL文件。我認爲,一旦源代碼被編譯,鏈接器就無法知道哪個部分是需要的,並且必須導入整個東西。 – baruch