參考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html
注意:gcc和g++是linux系統下的編程常用指令,C語言文件用gcc,cpp文件用g++。
1.預處理?
g++ -E filename.cpp > filename.i
功能:輸出預處理后的文件,linux下以.i為后綴名。只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里 。
這一步主要做了這些事情:宏的替換,還有注釋的消除,還有找到相關的庫文件。用編輯器打開Test.i會發現有很多很多代碼,你只需要看最后部分就會發現,預處理做了宏的替換,還有注釋的消除,可以理解為無關代碼的清除。下面是Test.i文件的最后部分,可以看見宏的替換和注釋的消除。
2.將.i文件生成.s匯編語言文件?
g++ -S filename.cpp?
功能:會生成Test.s文件,.s文件表示是匯編文件,用編輯器打開就都是匯編指令。
g++ -s filename.cpp / g++ filename.cpp
功能:會生成a.out文件,.out文件并不是可執行文件的擴展名,可以用objdump -S a.out打開就都是匯編指令,a表示默認文件名。
3.生成.o文件 ?
g++ -c filename.cpp?
功能:會生成template.o文件,.o是GCC生成的目標文件,除非你是做編譯器和連接器調試開發的,否則打開這種.o沒有任何意義,二進制機器碼一般人也讀不了。
4.連接目標代碼,生成可執行程序??
g++ Test.o -L /usr/lib/x86_64-linux-gnu/root5.34/cint/linclude/iostream
功能:將.o文件與所需的庫文件鏈接整合形成可執行文件。-L 表示鏈接,這里我后面寫的是絕對路徑,相對各人電腦不同
這樣生成的是默認文件名文件 a.out,也可以自己定義文件名在上面各個步驟中你可以用-o命令輸出你自己想要的各種名字。
g++ Test.cpp -o test.exe,最后面的文件有多種命名形式,test,test.exe,test.out都可以,運行的時候:./filename,如果想要打開這些文件,應該使用objdump -S filename
注意:
.out 是 gcc 編譯器的輸出文件的默認擴展名,并不是可執行文件的擴展名。gcc 可以輸出不能運行的文件,但默認還是 .out 。
.out文件就是擴展名為out的文件,它本身不代表任何信息。在Linux中判斷文件是否是可執行文件,首先要看文件的屬性是否是可執行的,它沒有一個默認的擴展名表示此文件為可執行文件。為了方便,Linux中可執行文件一般都是沒有擴展名的。 在使用gcc編程時,沒有指定輸入可執行文件名,默認生成可執行文件a.out文件。
?Linux 的可執行文件是基于權限確定的。而不是基于擴展名。