2017-07-10 36 views
0

對不起,如果這個問題很愚蠢,但我已經搜索了一下,沒有發現任何關於此事的信息。是否所有代碼都已編譯幷包含在最終的二進制文件中?

假設我用數百種方法創建類擴展,並將該類包含在我的項目中。現在假設從那個擴展中,我只使用2或3個方法。請記住,類擴展有數百種方法。

當我編譯的代碼什麼將包括在二進制文件?只是我從這個類擴展中使用的方法還是所有這些方法,甚至那些沒有被特定項目使用的方法?

+0

取決於您使用靜態鏈接還是動態鏈接。在動態鏈接中,只包含使用的符號名稱。在靜態鏈接中,如果使用'--no-whole-archive'等選項,則只包含使用的'.o'文件。否則,將包含整個'.a'文件。另外請注意,不僅會直接使用/覆蓋的方法將被調用。這也是關於vtables和東西。 –

+0

謝謝。請讓這個答案,所以我可以接受。 – Phox

回答

0

這可以分爲三類:

  • 動態(共享)在GNU LD在GNU LD
  • 靜態鏈接,--no-whole-archive
  • 靜態鏈接,--whole-archive

(其他連接器可能有類似的選項)。

動態鏈接

該代碼將只包含您正在擴展的庫中的方法名稱。

靜態鏈接,整個檔案

哎呀......其他類的整個代碼將被包括在內。

靜態鏈接,沒有整個存檔

只包含您使用的對象文件。我建議,對於大型課程,你儘可能地分割源代碼。

使用的方法

儘管你明確地使用,各自延伸/覆蓋需要像vtable一些符號的方法。請參閱您的編譯器文檔。

+0

對接受此延遲感到抱歉。感謝你的回答。 – Phox

相關問題