gcc編譯選項詳解

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 09:41
下一篇 2024-12-02 09:41

相關推薦

  • Python安裝選項怎麼選?

    Python是一種高級編程語言,可以廣泛應用於Web開發、數據科學、網絡爬蟲等領域。在進行Python開發時,我們首先需要進行Python的安裝,但是在安裝時會遇到各種選項,讓人不…

    編程 2025-04-29
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論