一、gcc編譯選項-Wdate-time
選項-Wdate-time用於在編譯時在生成的可執行文件中嵌入編譯時間。如果你想在代碼中輸出編譯時間,可以這樣:
#include int main() { printf("Compiled on %s at %s\n", __DATE__, __TIME__); return 0; }
編譯時使用-Wdate-time選項,運行後輸出的結果是:
Compiled on Jan 8 2022 at 21:02:29
二、gcc編譯選項x86
-m32和-m64選項用於指定編譯為32位或64位目標文件。例如,下面的代碼使用-m32選項編譯:
#include int main() { printf("The size of int is %lu bytes.\n", sizeof(int)); return 0; }
使用命令行進行編譯:gcc -m32 example.c -o example
運行得到輸出結果:
The size of int is 4 bytes.
三、gcc編譯選項說明
有一些常用的gcc編譯選項值得注意:
- -c:只編譯不鏈接,生成目標文件
- -o:指定生成的可執行文件名
- -g:生成調試信息,用於gdb調試
- -O:優化等級
- -std:指定使用的C/C++規範版本。例如:-std=c99(C99規範),-std=c++11(C++11規範)
四、gcc編譯選項中-Wall的作用
-Wall選項用於開啟gcc的所有警告信息,可以幫助我們在編譯時發現代碼中的潛在問題。同時,也可以通過-Wno-*選項禁止某些警告。
例如:
#include int main() { int a; if (a = 10) { printf("a is %d.\n", a); } return 0; }
編譯時使用-Wall選項:
gcc -Wall example.c -o example
得到以下警告信息:
example.c: In function ‘main’: example.c:5:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (a = 10) { ^
可以發現,代碼中的if語句中使用了賦值操作符,導致產生了警告。
五、gcc編譯選項大全
gcc提供了非常多的編譯選項,這裡列舉了一些常用的選項:
- -c:只編譯不鏈接,生成目標文件
- -o:指定生成的可執行文件名
- -g:生成調試信息,用於gdb調試
- -O:優化等級
- -std:指定使用的C/C++規範版本。例如:-std=c99(C99規範),-std=c++11(C++11規範)
- -Wall:開啟所有警告信息
- -Werror:將所有警告視為錯誤
- -Wno-*:禁止某些類型的警告
- -I:指定頭文件搜索路徑
- -L:指定庫文件搜索路徑
- -l:指定要鏈接的庫文件
- -m32:編譯為32位目標文件
- -m64:編譯為64位目標文件
六、gcc編譯選項FS
-fstack-protector選項用於在函數中添加代碼以檢查緩衝區溢出的情況。它可以保護程序免受棧溢出攻擊。
例如:
#include #include void foo(char *str) { char buffer[32]; strcpy(buffer, str); printf("buffer is %s.\n", buffer); } int main(int argc, char *argv[]) { foo(argv[1]); return 0; }
編譯時使用-fstack-protector選項:
gcc -fstack-protector example.c -o example
得到以下提示信息:
*** stack smashing detected ***: terminated
程序被終止,並且提示stack smashing detected,說明程序免受棧溢出攻擊。
七、gcc編譯選項超詳細
gcc編譯選項非常多,這裡列舉一些不常用但值得關注的選項:
- -Wformat-security:檢查格式化字符串函數中的安全性問題
- -Wstack-usage=n:檢查棧使用情況,當棧大小超過n時會發出警告
- -fno-omit-frame-pointer:禁用省略幀指針優化
- -ftracer:生成代碼來跟蹤函數調用
- -fno-plt:禁用過程鏈接表(PLT)
- -fno-stack-protector:禁用棧保護機制
八、gcc編譯選項c99標準
-std=c99選項用於指定C語言使用的標準版本,並開啟對應版本的語言特性支持。例如:
#include #include int main() { bool flag = true; printf("The value of flag is %d.\n", flag); return 0; }
編譯時使用-std=c99選項:
gcc -std=c99 example.c -o example
得到以下輸出結果:
The value of flag is 1.
可以發現,bool類型被正確地識別並輸出。
九、gcc的編譯命令
gcc的編譯命令除了上面提到的一些編譯選項之外,還可以結合一些其他命令使用,例如:
- 使用make命令自動編譯源碼
- 使用diff命令比較兩個不同版本的代碼
- 使用gdb調試器調試程序
下面是一個使用make命令進行自動編譯的示例makefile:
CC = gcc CFLAGS = -Wall -g all: example example: example.o $(CC) $(CFLAGS) example.o -o example example.o: example.c $(CC) $(CFLAGS) -c example.c clean: rm -rf *.o example
makefile中定義了要使用的編譯器和編譯選項,以及編譯的相關規則。使用make命令即可自動編譯生成可執行文件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/193803.html