當前目錄下有一hello.c
#include
int main()
獲得預處理以後的檔案 hello.i
gcc -e hello.c //只執行預編譯,即處理所有#開頭的部分 如:
#include
#define x 5
-e只會輸出在控制台上,如果想要得到hello.i,用:
gcc -e hello.c > hello.i
# 1 "hello.c"
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
/*...省略一萬行...
*/extern
void funlockfile (file *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4
# 2 "hello.c" 2
int main()
獲得匯程式設計序 hello.s
gcc -s hello.s //直接獲得hello.s(裡面都是彙編指令 用編譯器開啟即可看到)
"hello.s"
.file
"hello.c"
.section
.rodata
.lc0:
.string
"hello world!!!"
.text
.globl main
.type main, @function
main:
.lfb0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.lc0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret.cfi_endproc
.lfe0:
.size main, .-main
.ident
"gcc: (ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section
.note
.gnu-stack,"",@progbits
獲得可重定位目標檔案 hello.o
gcc -c hello.c //二進位制**,做聯結器試調可以用,普通人無法讀懂
獲得可執行目標程式 a.out
gcc hello.c 可以直接執行
c大致可以分為兩個常用版本 c90和c99
其中c90和ansi c是一樣的
用c90標準編譯
gcc -std=c89 hello.c //或者
gcc -ansi hello.c
用c99標準編譯
gcc -std=c99 hello.c
p.s.
gcc -o1 -o exe hello.c //-o1:一級編譯優化(同理-o2就是二級優化) 等級越高得出彙編**效率越高
//-o name : 輸出程式的名字 而不再叫a.out
gcc常用引數
gcc的一些重要引數 1.i 指定標頭檔案搜尋路徑 i 表include 如 gcc c hello.c o hello.o i usr include 2.l 指定要連線的庫所在的目錄 l 指定要連線的庫的名字 如 gcc main.o l usr lib lqt o hello 3.d 定義巨集...
gcc常用引數
今晚看了些有關gcc的編譯選項的內容,記錄下來以備查用。1 gcc c 只編譯不鏈結,生成.o檔案。例如,gcc c hello.c,將由hello.c得到hello.o 2 gcc o直接得到可執行檔案,並且可以指定可執行檔的名稱。例如,gcc o hello hello.c,將由hello.c得...
gcc常用引數
o file 指定輸出檔名,在編譯為目標 時,這一選項不是必須的。如果file沒有指定,預設檔名是a.out.c 只編譯不鏈結 dfoo bar 在命令列定義預處理巨集foo,其值為bar idirname 將dirname加入到頭檔案的搜尋目錄列表中 ldirname 將dirname加入到庫檔案...