0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

盤點一下gcc有哪些常用選項

學益得智能硬件 ? 來源:學益得智能硬件 ? 2023-05-09 17:17 ? 次閱讀

gcc有哪些常用選項,今天,就來給大家盤點一下。

-E表示預處理,處理所有以井號鍵開頭的代碼,常見的比如把頭文件展開。

hello.c

#include 


int main()
{
    printf("helloworld
");


    return 0;
}
預處理:
gcc -E hello.c -o hello.i
預處理后的文件:
# 1 "hello.c"
# 1 ""
# 1 ""
# 31 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 32 "" 2
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4 
# 27 "/usr/include/stdio.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4 
# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4 
# 1 "/usr/include/features.h" 1 3 4 
# 461 "/usr/include/features.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4 
# 452 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 
# 453 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/long-double.h" 1 3 4
# 454 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 462 "/usr/include/features.h" 2 3 4
# 485 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 486 "/usr/include/features.h" 2 3 4
# 34 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 2 3 4
# 28 "/usr/include/stdio.h" 2 3 4


# 1 "hello.c"
# 1 ""
# 1 ""
# 31 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "" 2
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4
# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 461 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 452 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 453 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
.....
-S表示編譯,把C文件變成匯編文件。

還是使用hello.c源文件。
gcc -S hello.c -o hello.s
匯編后的文件變成:
    .file   "hello.c"
    .text
    .section    .rodata
.LC0:
    .string "helloworld"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    endbr64
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16 
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    ......
-c表示匯編,把匯編文件變成二進制文件,但是這個二進制文件還不能運行,因為缺少庫的信息。

還是使用hello.c源文件:
gcc -c hello.c -o hello.o
匯編后的文件是二進制文件,用vim打開后是這樣:

e3475c2a-ee48-11ed-90ce-dac502259ad0.png ?

-l表示鏈接庫的名字,比如我們經常用的多線程,編譯的時候加上加上-lpthread 編譯器會自動去找 libpthread.so,如果代碼里面用到第三方庫,一般都要加上。

thread.c
#include 
#include 
#include 


void *my_thread(void *arg)
{
    printf("this is my thread ...
");
}


int main()
{
    pthread_t tid;


    if (pthread_create(&tid, NULL, my_thread, NULL) != 0)
    {   
        perror("pthread_create");
        exit(1);
    }


    void *status;
    pthread_join(tid, &status);


    return 0;
}
編譯:
gcc thread.c -o thread -lpthread
-L表示庫的路徑。如果是你自己制作的庫文件,并且沒有放在系統(tǒng)指定的目錄下,比如 /lib,那編譯的時候就要加上庫的路徑,否則,編譯器找不到庫在哪。

假設有個動態(tài)庫叫做 libtest.so,存放在當前目錄下:
root@Turbo:test# ls
hello.c  libtest.so

如果編譯的時候需要鏈接 libtest.so,則:

gcc main.c -o main -ltest -L .
-I表示頭文件路徑,常用于自己寫的頭文件,不在當前目錄下,那編譯的時候就得指定頭文件的路徑。

假設 hello.c 源文件包含了 hello.h 頭文件:
#include"hello.h"
hello.h存放在上一級目錄:
root@Turbo:test# ls
hello.c
root@Turbo:test# ls ..
hello.h  test
編譯的時候,需要指定頭文件的路徑:
gcc hello.c -o hello -I ..
-g表示可以調試,比如我們之前講的gdb、valgrind,如果想要調試的時候顯示源碼、行號,編譯的時候就需要加上-g選項。
gcc hello.c -o hello -g
-O表示優(yōu)化,可以是O0到O3,我們之前講volatile的時候,就用過這個選項,不同的優(yōu)化等級,對代碼的處理略微有些區(qū)別。

hello.c
#include 
#include 


void delay()
{
    int i, j;
    for (i = 0; i < 100000; i++)
    {   
        for (j = 0; j < 10000; j++);
    }   
}


int main()
{
    printf("%ld
", time(NULL));


    delay();


    printf("%ld
", time(NULL));


    return 0;
}

不優(yōu)化:
gcc hello.c -o hello
運行結果:
root@Turbo:test# ./hello 
1683603927
1683603929
root@Turbo:test#
優(yōu)化:
gcc hello.c -o hello -O3
運行結果:
root@Turbo:test# ./hello 
1683603941
1683603941
root@Turbo:test#
當然,還有 -o,表示輸出的意思,用來指定編譯后生成文件的名字。
gcchello.c-o hello
-Wall表示打開所有警告,有時候編譯器會認為一些不規(guī)范的寫法影響不大,并不會提示出來,加上Wall,會把這些不重要的警告也打印出來。

hello.c
#include 


int main()
{
    int i;


    return 0;
}
不打開警告編譯:
root@Turbo:test# gcc hello.c -o hello
root@Turbo:test#
打開警告編譯:
root@Turbo:test# gcc hello.c -o hello -Wall
hello.c: In function ‘main’:
hello.c:5:6: warning: unused variable ‘i’ [-Wunused-variable]
    5 |  int i;
      |      ^
root@Turbo:test#
-D表示添加宏定義,調試代碼的時候非常有用,可以避免每次都要修改代碼。

hello.c
#include 


int main()
{
#ifdef HELLO
    printf("helloworld
");
#endif


    return 0;
}
編譯不提供宏定義:
gcc hello.c -o hello
運行結果:
root@Turbo:test# ./hello 
root@Turbo:test#
編譯提供宏定義:
root@Turbo:test# gcc hello.c -o hello -DHELLO
root@Turbo:test#
運行結果:
root@Turbo:test# ./hello 
helloworld






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    786

    瀏覽量

    41564
  • GCC
    GCC
    +關注

    關注

    0

    文章

    105

    瀏覽量

    24804
  • VIM
    VIM
    +關注

    關注

    0

    文章

    134

    瀏覽量

    15261

原文標題:gcc常用選項盤點

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux GCC的編譯

    、Linux 多文件編譯 在上篇 Linux 的 C 編程我們知道了 Linux 的編譯器為
    的頭像 發(fā)表于 09-11 15:18 ?2431次閱讀
    Linux <b class='flag-5'>下</b><b class='flag-5'>GCC</b>的編譯

    常用編輯器之GCC編譯器

    :~$ sudo apt install gcc2、GCC的編譯選項GCC的基本用法是:gcc [選項
    發(fā)表于 08-24 11:05

    不常見但是很有用的 gcc 命令行選項

    些特殊的警告嗎?gcc 的很多命令行選項都不會經常用到,但是它們在某些特定的情況會變得非常有用,例如,當你在調試代碼的時候。所以在本文中
    發(fā)表于 12-31 11:08

    gcc和Linux gcc常用選項

    gcc的使用方法gcc選項】文件名gcc常用選項gcc
    發(fā)表于 10-19 22:43

    常見gcc編譯警告整理以及解決方法

     GCC很多的編譯選項,警告選項;指定頭文件、庫路徑;優(yōu)化選項。本文針整理一下
    發(fā)表于 11-14 11:19 ?2.1w次閱讀

    嵌入式Linux工具之GCC常用編譯選項

    “-I dir”選項可以在頭文件的搜索路徑列表中添加 dir 目錄。由于 Linux 中頭文件都默認放到了“/usr/include/”目錄下,因此,當用戶希望添加放置在其他位置的頭文件時,就可以通過“-I dir”選項來指定,這樣,g
    的頭像 發(fā)表于 03-22 11:16 ?7681次閱讀
    嵌入式Linux工具之<b class='flag-5'>GCC</b><b class='flag-5'>常用</b>編譯<b class='flag-5'>選項</b>

    盤點一下哪些手機支持5G網絡呢

    隨著5G網絡的推廣,各大廠商也開始陸續(xù)推出支持5G網絡的手機。今天為大家盤點一下,究竟哪些手機支持5G網絡呢。
    的頭像 發(fā)表于 08-22 11:54 ?1.6w次閱讀

    Linux和UNIX的GCC命令大全

    GCC 超過 100 個的編譯選項可用。 這些選項中的許多你可能永遠都不會用到, 但些主要的選項
    發(fā)表于 11-01 08:00 ?0次下載
    Linux和UNIX的<b class='flag-5'>GCC</b>命令大全

    Linux系統(tǒng)Gcc的基本用法和選項

    在使用Gcc編譯器的時候,我們必須給出系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數
    發(fā)表于 08-20 09:57 ?1254次閱讀

    gcc的使用方法以及Linux gcc常用選項

    gcc的使用方法 gcc選項】文件名 gcc常用選項 g
    的頭像 發(fā)表于 10-22 14:42 ?3038次閱讀

    gcc的編譯選項總結

    本文用于記錄我在學習和工作中遇到的各種GCC選項,雖然這些選項可以在GNU的手冊上查到,不過這里做個總結,可以避免每次都去查手冊,算是個備忘吧。本文的內容會不斷更新擴充。
    的頭像 發(fā)表于 11-02 09:37 ?1500次閱讀

    tcpdump常用選項參數詳細總結

    常用選項通過上述的實戰(zhàn)案例,相信大家已經掌握的 tcpdump 基本用法,在這里來詳細總結一下常用選項參數。 (
    的頭像 發(fā)表于 09-28 15:52 ?1711次閱讀

    認識一下幾個常用的門級電路

    標準單元庫是數字集成電路的積木,是復雜電路和系統(tǒng)的基礎。今天我們來認識一下其中的幾個常用門級電路。
    的頭像 發(fā)表于 10-09 15:49 ?1401次閱讀
    認識<b class='flag-5'>一下</b>幾個<b class='flag-5'>常用</b>的門級電路

    盤點一下CST電磁仿真軟件的求解器

    今天我們起來盤點一下CST電磁仿真軟件那些牛叉的求解器??靵頂?b class='flag-5'>一下,你用了里面的幾種吧!
    的頭像 發(fā)表于 11-20 10:18 ?5898次閱讀
    <b class='flag-5'>盤點</b><b class='flag-5'>一下</b>CST電磁仿真軟件的求解器

    盤點一下高通CES 2024汽車創(chuàng)新技術

    在CES2024上,我們看到英特爾和AMD加入,加上原來的英偉達,高通需要和這些跨行的對手在個賽道卷,目前高通在數字座艙、云連接、人工智能和自動駕駛領域是定的積累的,我們來盤點
    的頭像 發(fā)表于 01-13 15:22 ?1739次閱讀
    <b class='flag-5'>盤點</b><b class='flag-5'>一下</b>高通CES 2024汽車創(chuàng)新技術