1. 程式人生 > 其它 >【作業系統】GCC

【作業系統】GCC

簡介

gcc 和 g++:

  • 只要是 gcc 支援編譯的程式程式碼,都可以使用 gcc 命令完成編譯,但如果使用 g++ 指令,則無論目標檔案的字尾名是什麼,該指令都一律按照編譯 C++ 程式碼的方式編譯該檔案。
  • 如果想使用 gcc 指令來編譯執行 C++ 程式,需要在使用 gcc 指令時,手動為其新增 -lstdc++ -shared-libgcc 選項,表示 gcc 在編譯 C++ 程式時可以連結必要的 C++ 標準庫。

一步完成

一些引數:

  • -o 手動指定最終生成的可執行檔案的檔名:gcc demo.c -o demo
    • gcc [-E|-S|-c] [輸入檔案] [-o 輸出檔案]
    • 輸入檔案可有多個。
  • -x 設定檔案所使用的語言使字尾名無效:gcc -xc++ demo.c
  • -Idir 在你是用 #include "file" 的時候, gcc/g++ 會先在當前目錄查詢你所制定的標頭檔案,如果沒有找到, 他回到預設的標頭檔案目錄找,如果使用 -I 制定了目錄,他會先在你所制定的目錄查詢,然後再按常規的順序去找。
  • -std= 手動指令程式語言所遵循的標準:-std=c++11

例—— C:

$ gcc demo.c
$ ls -a
.         ..        .DS_Store a.out     demo.c
$ ./a.out
Hello World

例—— C++:

$ g++ demo.c
# 或
$ gcc -xc++ demo.cpp -lstdc++ -shared-libgcc 

多步完成


預處理

gcc -E demo.c -o demo.i

  • 選項 -E
  • 字尾 .i

預設情況下 gcc -E 指令只會將預處理操作的結果輸出到螢幕上,並不會自動儲存到某個檔案。因此該指令往往會和 -o 選項連用,將結果匯入到指令的檔案中。

其它引數:

  • -C:阻止 gcc 刪除原始檔和標頭檔案中的註釋。
  • -D name[=definition]:在處理原始檔之前,先定義巨集 name。搭配原始碼中的 #ifdef name 命令使用,可以實現條件式編譯。
  • -U:如果在命令列或 gcc 預設設定中定義過巨集 name,則取消 name 的定義。

編譯

gcc -S demo.c -o demo.sgcc -S demo.i -o demo.s

  • 選項 -S
  • 字尾 .s,編譯操作會預設建立一個檔名相同,字尾為 .s 的檔案。

gcc -S 指令操作的檔案並非必須是經過預處理後得到的 .i 檔案,-S 選項的功能是令 gcc 編譯器將指定檔案處理至編譯階段結束。


彙編

gcc -c demo.s -o demo.o

  • 選項 -c
  • 字尾 .o,彙編操作會預設建立一個檔名相同,字尾為 .o 的檔案。

gcc -S 類似,gcc -c 選項並非只能用於加工 .s 檔案。事實上,-c 選項只是令 gcc 編譯器將指定檔案加工至彙編階段,但不執行連結操作。


連結

gcc demo.o -o demo.exe


其它

一次性處理多個檔案:

  • 進入該專案目錄,用 *.c 表示所有的原始檔:gcc *.c -o main.exe

標頭檔案與庫檔案:

  • 標頭檔案只儲存變數、函式或者類等這些功能模組的宣告部分。
  • 庫檔案負責儲存各模組具體的實現部分。
  • 所有的庫檔案都提供有相應的標頭檔案作為呼叫它的介面。庫檔案是無法直接使用的,只能通過標頭檔案間接呼叫。

標頭檔案:

  • -include filename:相當於在程式碼中使用 #include <filename>
  • -iquote dir-Ipath-isystem dir-idirafter dir
    • 編譯時指定標頭檔案目錄,使用標準庫時不需要指定目錄。
    • 搜尋順序(對於用 #include "" 引號形式引入的標頭檔案):(也不知道對不對,咕咕咕~
      • 當前程式檔案所在的目錄。
      • -iquote
      • -I
      • -isystem
      • -idirafter

連結庫:

  • -Ldir:搜尋庫的路徑。
  • -llibrary:編譯的時候使用的庫。

其它:

  • -M:生成檔案關聯的資訊,包含目標檔案所依賴的所有原始碼。
  • -Wall:生成所有警告資訊。
  • -w:不生成任何警告資訊。

參考