next up previous contents
Next: 多檔編譯 Up: gcc 編譯 Previous: 編譯步驟   Contents

編譯器 gcc

  1. 以 vi 編輯程式檔 hello.c
    [dywang@dyw219 zzz]$ vi hello.c
    #include <stdio.h>
    main()
    {
            printf("Hello!\n");
    }
    
  2. 僅將原始碼編譯成為目標檔,並不製作連結等功能。
    [dywang@dyw219 zzz]# gcc -c hello.c
    
  3. 自動的產生 hello.o 這個檔案,但是並不會產生 binary 執行檔。
    [dywang@dyw219 zzz]$ ll hello.*
    -rw-rw-r--. 1 dywang dywang   58 Apr 26 15:20 hello.c
    -rw-rw-r--. 1 dywang dywang 1488 Apr 26 15:20 hello.o
    
  4. 在編譯的時候,依據作業環境給予最佳化執行速度,以下命令會自動的產生 hello.o 這個檔案,並且進行最佳化。
    [dywang@dyw219 zzz]# gcc -O hello.c -c
    
  5. 將編譯的結果輸出成某個特定檔名,-o 後接的是要輸出的 binary file 檔名。
    [dywang@dyw219 zzz]# gcc -o hello hello.c
    [dywang@dyw219 zzz]$ ll hello*
    -rwxrwxr-x. 1 dywang dywang 6663 Apr 26 15:22 hello
    -rw-rw-r--. 1 dywang dywang   58 Apr 26 15:20 hello.c
    -rw-rw-r--. 1 dywang dywang 1488 Apr 26 15:20 hello.o
    
  6. 在編譯的時候,輸出較多的訊息說明,加入 -Wall,程式的編譯時會顯示警告訊息,-Wall 或 -O 等參數為旗標 (FLAGS),簡稱這些旗標為 CCFLAGS。
    [dywang@dyw219 zzz]# gcc -o hello hello.c -Wall 
    hello.c:2:1: warning: return type defaults to ‘int’ [-Wreturn-type]
     main()
     ^
    hello.c: In function ‘main’:
    hello.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
    
  7. 在進行 binary file 製作時,將連結的函數庫與相關的路徑填入。
    1. -lm 指的是函數庫檔案 libm.so 或 libm.a;
    2. -L 後面接函數庫的搜尋目錄路徑;
    3. -I 後面接原始碼內的 include 檔案之所在目錄。
    [dywang@dyw219 zzz]$ gcc -o hello1 hello.c -lm -L/usr/lib -I/usr/include
    
  8. 產生的 hello1 與先前的 hello 不同,包含了 libm.so.6 函數。
    [dywang@dyw219 zzz]$ ldd hello
    	linux-vdso.so.1 =>  (0x00007fff308dd000)
    	libc.so.6 => /lib64/libc.so.6 (0x000000394aa00000)
    	/lib64/ld-linux-x86-64.so.2 (0x0000560fe1b54000)
    [dywang@dyw219 zzz]$ ldd hello1
    	linux-vdso.so.1 =>  (0x00007ffce89bb000)
    	libm.so.6 => /lib64/libm.so.6 (0x000000394ae00000)
    	libc.so.6 => /lib64/libc.so.6 (0x000000394aa00000)
    	/lib64/ld-linux-x86-64.so.2 (0x000055a2b0e7f000)
    



2019-06-17