當建立一個目標文件(lib*.o
)時,有沒有什麼辦法告訴編譯器(gcc/mingw32)只暴露.c文件中的某些函數?
我想這樣做的原因是我靜態鏈接到一個100,000+線庫(SQLite),但我只使用它提供的少數功能。我希望如果我能告訴編譯器只公開這些函數,它會優化出那些我選擇的那些從不需要的函數的所有代碼,從而縮小庫的大小。靜態庫「接口」
Q
靜態庫「接口」
4
A
回答
1
我發現了幾種可能的解決方案:
這就是我問到的。這是gcc相當於Windows的dllexpoort
的:
- http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Code-Gen-Options.html(
-fvisibility
) - http://gcc.gnu.org/wiki/Visibility
我還發現鏈接時代碼生成。這允許鏈接器查看代碼的哪些部分實際使用並擺脫其餘部分。與strip
和-fwhole-program
一起使用,給了我更好的結果。
- http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Optimize-Options.html(見
-flto
和-fwhole-program
)
注:此標誌纔有意義,如果你不是在一個調用gcc的,這是我在做什麼編譯整個程序(使一個sqlite.o文件,然後靜態鏈接它)。
第三個選項,我發現但尚未看着這裏提到:
0
這可能是連接器的工作,而不是編譯器。當把它作爲一個程序(.exe)鏈接時,鏈接器將只處理導入相關的符號,並且當鏈接一個DLL時,__dllexport機制可能就是你正在尋找的,或者一些ld的標誌可以幫助你(man LD)。
相關問題
- 1. IDL靜態接口
- 2. 鏈接靜態庫與靜態庫
- 3. UNIX:靜態庫鏈接到靜態庫
- 4. 靜態鏈接庫
- 5. Visual Studio:靜態鏈接到靜態庫
- 6. 在接口的靜態
- 7. ARC靜態接口問題
- 8. Java靜態接口變量
- 9. JNI和靜態接口
- 10. c中的靜態接口#
- 11. 接口,靜態類問題
- 12. 將動態庫鏈接到鏈接到其他靜態庫的靜態庫
- 13. 在窗口下將靜態鏈接庫轉換爲動態鏈接庫
- 14. EXE出口靜態庫出口以及
- 15. 使用COM接口而沒有靜態鏈接到庫
- 16. 靜態庫鏈接兩次
- 17. C靜態鏈接庫嗎?
- 18. 鏈接靜態庫爲R
- 19. 靜態鏈接DCMTK庫
- 20. Qt:庫的靜態鏈接
- 21. 級聯靜態庫鏈接?
- 22. 鏈接到靜態庫
- 23. 對鏈接的靜態庫
- 24. 靜態庫鏈接失敗
- 25. 在另一個靜態庫中鏈接靜態庫
- 26. 鏈接靜態庫,共享另一個靜態庫
- 27. 鏈接第三方靜態庫到另一個靜態庫
- 28. 將靜態庫鏈接到另一個靜態庫
- 29. 鏈接靜態庫與其他靜態庫
- 30. 什麼是靜態庫,靜態鏈接動態庫和動態鏈接動態庫的.lib文件?
我使用'.so'文件,而不是DLL文件。我認爲,一旦源代碼被編譯,鏈接器就無法知道哪個部分是需要的,並且必須導入整個東西。 – baruch