不必要的目標文件請看下面的例子編譯與海灣合作委員會
g++ a.o b.o c.o -o prog
如果是情況c.o
不提供任何可執行代碼prog
,也沒有關於c.o
任何依賴於任何其他文件, GCC還會在prog
中包含c.o
的內容嗎?
換句話說,除了編譯時間之外,編譯不必要的文件到可執行文件會產生什麼(如果有)負面影響?
在此先感謝;乾杯!
不必要的目標文件請看下面的例子編譯與海灣合作委員會
g++ a.o b.o c.o -o prog
如果是情況c.o
不提供任何可執行代碼prog
,也沒有關於c.o
任何依賴於任何其他文件, GCC還會在prog
中包含c.o
的內容嗎?
換句話說,除了編譯時間之外,編譯不必要的文件到可執行文件會產生什麼(如果有)負面影響?
在此先感謝;乾杯!
除了您的可執行文件可能不必要的大,沒有任何負面影響。鏈接器可能會死掉未使用的代碼,這會使事情退步。您可以在輸出可執行文件上使用某種對象查看工具(otool
,objdump
,nm
等)來查看您的程序是否有額外的符號。
我使用的是Mac,所以會有一定的差異,如果您使用的是一套標準的GCC工具,但這裏有一個例子:
$ make
gcc -o app main.c file2.c
gcc -Wl,-dead_strip -o app_strip main.c file2.c
$ ls -l app*
-rwxr-xr-x 1 carl staff 8744 Feb 6 20:05 app
-rwxr-xr-x 1 carl staff 8704 Feb 6 20:05 app_strip
我認爲在非蘋果GCC世界,在我的例子中,你可以通過-Wl,--gc-sections
而不是-Wl,-dead_strip
。在兩個可執行文件,你可以看到大小不同的是,由於額外的功能被剝離:
$ nm app | cut -c 20- > app.txt
$ nm app_strip | cut -c 20- > app_strip.txt
$ diff app.txt app_strip.txt
8d7
< _function2
我剛剛與我目前使用的一些C代碼試了一下 - 我在這包含的方法不是一個對象鏈接(還)在程序中的其他地方使用。該代碼包含在生成的可執行文件中,通過運行nm
對elf文件進行檢查,並觀察到方法T確實存在,即使使用了-O2和-O3。
llvm
可以消除鏈接步驟中的死碼。它使用特殊鏈接器llvm-ld
。
此外,使用-fwhole
或-ipo
(intel)將有助於將死去的符號分離出去。
是的,GCC將包含所有的目標文件。使用最新的編譯器(開發版本4.5.0),您可以使用-flto
(鏈接時優化)來執行該操作。
您可以嘗試使用和不使用額外庫的鏈接,並查看可執行文件是否具有相同的大小。 – 2010-02-07 03:57:32
我不瞭解GCC,但MSVC將包含所有.obj文件的內容,無論您是否引用它們,但它只包含您引用的.lib文件的各個部分。我希望GCC是相同的 – 2010-02-07 04:03:42
所描述的步驟通常稱爲「鏈接」。術語「編譯」通常用於描述目標文件的生成。 – MSalters 2010-02-08 10:57:16