【作業系統】GCC
阿新 • • 發佈:2022-03-15
簡介
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.s
或 gcc -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
:不生成任何警告資訊。