Linux 下進行 C 或 C++ 編程時重要的 GCC 標志
如果您在 Linux 下進行 C 或 C++ 編程,則必然要采用 GNU GCC 來編譯 C 或 C++ 源代碼生成可執行程序。
和往常一樣,您可以使用標志來擴展功能。
那么讓我們看看一些最重要的 GCC 標志。
重要的 GCC 標志
為了便于理解,我將使用以下 C 程序:
很簡單,對吧?不要以此議論我的編程技能哦。
1.使用-o指定輸出文件名
在最基本的術語中,您將按如下方式使用 GCC 編譯器:
上面的命令將編譯程序并創建一個名稱為的可執行文件a.out.:
要指定輸出可執行文件名,您需要做的就是在文件名后附加-o標志,如下所示:
例如,在這里,我將可執行文件命名為linuxmi:
2.使用 -Wall 啟用每個警告
如果您想打印每個警告以便您可以檢查您的代碼并使它比以往更好,請使用該-Wall標志。
例如,在這里,我將使用不初始化變量的代碼:
當我執行代碼時,它給了我一條警告‘i’ is used uninitialized:如下圖
3.使用 -l 鏈接共享庫
要將 C 程序與共享庫鏈接,您所要做的就是在共享庫的名稱后附加-l標志。
例如,在這里我將代碼 main.c 與共享庫鏈接起來pthread?以生成最終的可執行文件linuxmi:
但是如果你想鏈接外部庫怎么辦?在這種情況下,您必須使用-L。
例如,在這里,我鏈接了存儲在 /home/linuxmi/LHB 中的共享庫“LHB”:
4.僅使用 -E 獲取預處理器輸出
預處理是編譯的第一階段,如果你只關心第一階段代碼發生了什么,你可以使用-E標志。
在這里,我將標準輸出重定向到first-stage.i文件:
5.使用 -S 獲取匯編代碼
如果您關心編譯期間的程序集輸出,可以使用-S標志輕松生成。
在這里,我生成了main.c?名為 as的程序集輸出main.s:
6.僅使用 -C 生成編譯后的代碼
要在沒有任何鏈接的情況下獲得編譯代碼,您所要做的就是使用-C標志。
例如,在這里,我main.c?在名為的文件中生成了編譯代碼compiled:
7.使用 -save-temps 生成所有中間文件
之前,我解釋了如何獲得預處理、匯編和編譯的輸出,但是如果我告訴您可以一次獲得所有這些結果呢?
它非常簡單,可以使用-save-temps標志輕松生成。
假設我想為 main.c文 件生成所有中間文件,所以我需要遵循給定的命令:
8.使用 -Werror 將警告轉換為錯誤
在測試時,我們程序員往往會忽略可能表明應用程序中存在漏洞和安全威脅的警告。
為了使您的代碼堅如磐石,我建議您使用-Werror標志將警告轉換為錯誤。
在這里,我使用的代碼會給你一個警告,說“undefined variable c”:
但是當我-Werror在執行時使用標志時:
它沒有警告,而是給了我一個錯誤:
9.使用 -fPIC 獲取與位置無關的代碼
對于那些處理動態鏈接的人來說,這個標志可能是至關重要的,尤其是共享庫。
在創建共享庫時,您應該擁有與位置無關的代碼,以便您可以從任何地址而不是靜態地址加載共享庫。
例如,在這里,我從 main.c?創建了一個名為libmain.so的共享庫:
10. 使用 -V 獲取詳細的編譯輸出
如果您想逐行了解 GCC 對您的代碼做了什么,您可以使用該-V標志來獲得詳細的輸出。
獎勵認真學習的朋友:使用文件應用 GCC 標志
如果您使用同一組標志來編譯程序,擁有一個包含必要選項的文件可以為您節省大量時間。
首先,讓我們使用 touch 命令創建一個文件:
現在,您可以使用任何您喜歡的文本編輯器來輸入標志。只需確保用空格分隔它們即可。
我在文件中保存了 3 個標志:
完成添加標志后,您所要做的就是在文本文件中附加@符號:
如您所見,它將警告轉換為錯誤并創建了所有中間文件。