gcc、make編譯


一 arm-linux-gcc 常用參數

https://www.cnblogs.com/zhangpengshou/p/3587751.html

二 arm-linux-objdump常用參數

https://blog.csdn.net/freeplayer/article/details/45133721

三 arm-linux-objcopy常用參數

https://blog.csdn.net/tang_jin_chan/article/details/8675269

四 GCC

1 GCC編譯流程:

  1. 預處理(Pre-Processing)

  2. 編譯(Compiling)

  3. 匯編(Assembling)

  4. 鏈接(Linking)

2 GCC所支持的后綴名解釋

后綴名 所對應的語言 編譯流程
.c C源程序 預處理、編譯、匯編
.C/.cc/.cxx C++源程序 預處理、編譯、匯編
.m Objective-C源程序 預處理、編譯、匯編
.i 已經預處理的c源程序 編譯、匯編
.ii 已經預處理的c++源程序 編譯、匯編
.s/.S 匯編語言源程序 匯編
.h 預處理文件(頭文件) 預處理
.o 目標文件 鏈接
.a/.so 靜態/動態庫文件 鏈接

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 GCC編譯流程分析

3.1 預處理階段

命令格式:
    gcc -E -o [目標文件] [編譯文件]  

注: -E 使編譯器在預處理結束時就停止編譯

     -o 指定GCC輸出的結果

 

 

 

 

 

 

gcc  -E  -o  hello.i  hello.c
//".h"文件是不能進行編譯的,所以需要生成".i"文件;<.i文件是經過預處理的c源程序>
//預處理階段結果:將"hello.h"的內容添加到"hello.i"文件中
/*如果在一個test的文件夾中*/
gcc  -E -o test/hello.i  test/hello.c

3.2 編譯階段

  編譯器在預處理結束后進行編譯。GCC首先要檢測代碼的規范性,是否有語法錯誤等,以確定代碼實際要做的工作。檢查無誤后就開始把代碼翻譯成匯編語言,GCC的選項‘-S’能使編譯器進行完編譯后就停止。

gcc  -S  -o  hello.s  hello.i
//".s"代表匯編語言源程序,
//編譯結果:將"hello.i"代碼翻譯成"hello.s"的匯編代碼
/*如果在一個test的文件夾中*/
gcc  -S  -o  test/test.s  test/test.i

3.3 匯編階段

  把編譯階段生成的".s"文件生成為目標文件

gcc  -c  hello.s  -o  hello.o
//使用"-c"可以看到由匯編代碼轉換為".o"的二進制代碼
/*如果在一個test的文件夾中*/
gcc  -c test/hello.s  -o  test/hello.o

3.4 鏈接階段

  編譯成功后進入鏈接階段,進入鏈接后生成可執行的文件

gcc  hello.o  -o  hello

  運行執行文件,輸出結果

./hello
/*如果在一個test的文件夾中*/
gcc test/hello.o  -o  test/hello    //hello為執行文件

./test/hello  //執行執行文件

4 直接生成一個執行文件

gcc  test/hello.c  -o  test/hello

四 make

1 makefile術語

規則:用於說明如何生成一個或多個目標文件

  規則格式如下:(-c只產生一個.o的目標文件)

    targetsprerequisite

          command

    目標  依賴  命令

    main.o : main.c

          gcc -c main.c   [命令需要以【Tab】鍵開始]

   解釋:目標就是生成一個main.o,依賴於main.c文件,命令就是gcc -c main.c

hello:main.o func1.o func2.o  //hello為最終目標的可執行文件
    gcc main.o func1.o func2.o -o hello

main.o:main.c
    gcc -c main.c
func1.o : func1.c
    gcc -c func1.c
func2.o : func2.c
    gcc -c func2.c
.PHONY :clean
clean:
    rm -f hello main.o func1.o func2.o

2 目標

Makefile中,規則的順序是很重要的,因為Makefile中只應該有一個最終目標,其它的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什么。一般來說,定義在Makefile中的目標可能會有很多,但是第一條規則中的目標將被確立為最終的目標。

3 文件名

make命令默認在當前目錄下尋址名字為Makefile或makefile的工程文件,當名字不為這兩者之一時,可以使用如下方法指定。

    make -f 文件名

4 示例

4.1 在test文件夾中創建makefile文件

dongry@d-linux:~$ vim test/makefile           //在test文件夾中創建一個makefile文件

4.2 編寫makefile文件(haha.o為需編譯生成的目標文件,名字隨便起)

haha.o : test/test1.c
    gcc -c test/test1.c -o test/haha.o    //開頭【tab】鍵

4.3 進入目標文件夾進行make

4.3.1 進入目標文件夾

dongry@d-linux:~$ cd test

4.3.2 make

dongry@d-linux:~/test$ make
    gcc -c test1.c -o haha.o   //表示成功生成haha.o目標文件

4.3.3 退出當前目錄

dongry@d-linux:~/test$ cd ~
dongry@d-linux:~$

5 偽目標

 makefile把那些沒有任何依賴只有執行動作的目標稱為"偽目標"。(phony targets)

 .PHONY clean   [".PHONY"將"clean"聲明為偽目標]

 clean :

 【Tab】 rm -f main.o func1.o func2.o

6 變量

  hello : main.o func1.o func2.o 

    gcc -c main.o func1.o func2.o -o hello

  給hello目標添加一個依賴,如func3.o,如何實現。

  方法一: 

  hello : main.o func1.o func2.o func3.o

    gcc -c main.o func1.o func2.o func3.o -o hello

  方法二:

  obj=main.o func1.o func2.o func3.o

  hello : $(obj)

    gcc -c $(obj) -o hello

6.1 在makefile系統中存在系統默認的自動化變量

  $^:代表所有的依賴文件

  $@:代表目標

  $<:代表第一個依賴文件

  eg:

  hello : main.o func1.o func2.o

    gcc -c main.o func1.o func2.o -o hello

  同:hello :main.o func1.o func2.o

        gcc $^ -o $@

7 常用項

 makefile中"#"后面的被認為是注釋

hello : hello.c @gcc hello.c -o hello "@"取消回顯    //表示輸入make命令后,不出現下面的一行:
                                     gcc -c test1.c -o haha.o  //不會出現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM