正文:編譯流程分析:
編譯分為幾個過程:
a:預處理
b:編譯
c:彙編
d:鏈結
以下分析,如何處理各個階段:
首先預處理階段:
目的就是要使include之中的內容編譯進去。並且用-e命令作用是進行檢視。作用是gcc的預處理過程結束後停止編譯
gcc指令的一般格式為 gcc[選項] 要編譯的檔案 [選項][目標檔案]
其中,目標檔案可以預設 gcc預設生成可執行檔案 命名編譯檔案.out
gcc -e hello.c -o hello.i
2.編譯階段 gcc -s hello.i -o hello.s
3.彙編階段就是生成二進位制**的時候 gcc -c hello.s -o hello.o
4.鏈結階段
在成功編譯後,就進入鏈結階段。函式庫的概念在這裡很重要
這個程式之中並沒有定義printf的函式實現、在預處理階段包含了stdio.h也只是函式的生命。而沒有定義函式的實現。系統吧函式的實現都被做到名為libc.so.6的函式檔案之中去了。在沒有特定的指出是。gcc就到系統預設的搜尋路徑/usr/lib下查詢
鏈結過程分為動態鏈結還有靜態鏈結兩種形式。靜態鏈結的檔案是.a的形式。動態鏈結的形式是.so的形式
libc.so.6就是動態鏈結庫,gcc一般都是預設使用的是動態鏈結庫
後面還要用到
gcc hello.o -o hello
./hello
總共有的步驟
gcc -e hello.c -o hello.i
gcc -s hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello
./hello
條件講解
-c之編譯不鏈結 生成的是目標** .o檔案
-s之編譯不彙編生成的是彙編**
-e只進行預編譯。不做其他處理
-g在可執行程式中包含便準除錯資訊
-o file 把輸出檔案輸出到fill裡面
-v 列印出編譯器內部編譯過程的命令列資訊和編譯器的版本
-i dir 在標頭檔案的搜尋路徑列表中新增dir目錄
-l dir 在庫檔案的搜尋路徑列表中新增dir目錄
-static 鏈結靜態庫
-llibrary 連線名為library的庫檔案
linux之中標頭檔案預設放在/usr/include/目錄下。因此當使用者希望新增放置在其他位置的標頭檔案時候。就需要透過 -i dir選項來指定 這樣
eg gcc hello.c -i/root/workplace/gcc/ -o hello1
這樣gcc就可以執行正確結果了
注意事項include之中<>是表示在標準路徑之中搜尋檔案。而""是表示在本目錄之中搜尋檔案。所以也可以用"my.h" 從而就不用在寫-i的問題了
哈哈哈 以前c語言老師講過哈 沒有在意 。。沒想到 還挺有用的 我覺得他好強大啊
l-dir指定的是動態鏈結庫的路徑。需要注意的是
-i dir 還有 -l dir 都是指定路徑 沒有指定檔案。因此不能再路徑之中包含檔名
沒有看的:
gcc警告的問題
gcc優化選項
gcc體系結構相關選項
[root@localhost ~]# cd desktop
[root@localhost desktop]# gcc -e hello.c -o hello.i
gcc: hello.c:沒有那個檔案或目錄
gcc: 沒有輸入檔案
[root@localhost desktop]# gcc -e helllo.c -o helllo.i
[root@localhost desktop]# gcc -s helllo.i -o helllo.s
[root@localhost desktop]# gcc -c helllo.s -o helllo.o
[root@localhost desktop]# gcc helllo.o -o helllo
[root@localhost desktop]# helllo
bash: helllo: command not found
[root@localhost desktop]# ./helllo
//預設的尋找目錄是usr/bin 所以要入./
i like china[root@localhost desktop]#
[root@localhost desktop]# sl
bash: sl: command not found
[root@localhost desktop]# ls
gnome-terminal.desktop helllo.i
helllo
helllo.o
#helllo.c#
helllo.s
helllo.c
usrhelllo.c~
xorg-x11-server-xnest-1.3.0.0-17.fc7.i386.rpm
[root@localhost desktop]# ls
gnome-terminal.desktop helllo.i
helllo
helllo.o
#helllo.c#
helllo.s
helllo.c
usrhelllo.c~
xorg-x11-server-xnest-1.3.0.0-17.fc7.i386.rpm
[root@localhost desktop]# helllo
bash: helllo: command not found
[root@localhost desktop]# ./helllo
i like china[root@localhost desktop]# cd
GCC編譯四階段
linux下程式編譯的四個階段 預處理 編譯 彙編 鏈結 gcc gun c compiler 但現在不只侷限於c語言 預處理 preprocessing gcc e hello.c o hello.i e選項意思不曉得 1 在源程式中插入include包含的標頭檔案 2 巨集定義的替換 編譯 co...
程式編譯的幾個階段
程式編譯的過程中就是將使用者的文字形式的源 c c 轉化成計算機可以直接執行的機器 的過程。主要經過這麼幾個過程 1 編譯,由編譯器將c源 cpp 轉變成彙編 s 2 彙編,由彙編器將彙編 s 轉變成目標 o 3 鏈結,由鏈結器將 在執行過程用到的其他目標 和庫檔案鏈結成為乙個可執行程式也就是目標程...
程式編譯的幾個階段
程式編譯的過程中就是將使用者的文字形式的源 c c 轉化成計算機可以直接執行的機器 的過程。主要經過這麼幾個過程 1 編譯,由編譯器將c源 cpp 轉變成彙編 s 2 彙編,由彙編器將彙編 s 轉變成目標 o 3 鏈結,由鏈結器將 在執行過程用到的其他目標 和庫檔案鏈結成為乙個可執行程式也就是目標程...