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