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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

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

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

hello.c

#include 


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


    return 0;
}
預(yù)處理:
gcc -E hello.c -o hello.i
預(yù)處理后的文件:
# 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表示匯編,把匯編文件變成二進(jìn)制文件,但是這個二進(jìn)制文件還不能運行,因為缺少庫的信息

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

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

-l表示鏈接庫的名字,比如我們經(jīng)常用的多線程,編譯的時候加上加上-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,那編譯的時候就要加上庫的路徑,否則,編譯器找不到庫在哪。

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

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

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

假設(shè) 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表示可以調(diào)試,比如我們之前講的gdb、valgrind,如果想要調(diào)試的時候顯示源碼、行號,編譯的時候就需要加上-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
運行結(jié)果:
root@Turbo:test# ./hello 
1683603927
1683603929
root@Turbo:test#
優(yōu)化:
gcc hello.c -o hello -O3
運行結(jié)果:
root@Turbo:test# ./hello 
1683603941
1683603941
root@Turbo:test#
當(dāng)然,還有 -o,表示輸出的意思,用來指定編譯后生成文件的名字。
gcchello.c-o hello
-Wall表示打開所有警告,有時候編譯器會認(rèn)為一些不規(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表示添加宏定義,調(diào)試代碼的時候非常有用,可以避免每次都要修改代碼。

hello.c
#include 


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


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






審核編輯:劉清

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

    關(guān)注

    2

    文章

    795

    瀏覽量

    41716
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    24861
  • VIM
    VIM
    +關(guān)注

    關(guān)注

    0

    文章

    134

    瀏覽量

    15313

原文標(biāo)題:gcc常用選項盤點

文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux GCC的編譯

    、Linux 多文件編譯 在上篇 Linux 的 C 編程我們知道了 Linux 的編譯器為
    的頭像 發(fā)表于 09-11 15:18 ?2686次閱讀
    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 的很多命令行選項都不會經(jīng)常用到,但是它們在某些特定的情況會變得非常有用,例如,當(dāng)你在調(diào)試代碼的時候。所以在本文中
    發(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 中頭文件都默認(rèn)放到了“/usr/include/”目錄下,因此,當(dāng)用戶希望添加放置在其他位置的頭文件時,就可以通過“-I dir”選項來指定,這樣,g
    的頭像 發(fā)表于 03-22 11:16 ?7735次閱讀
    嵌入式Linux工具之<b class='flag-5'>GCC</b><b class='flag-5'>常用</b>編譯<b class='flag-5'>選項</b>

    盤點一下哪些手機(jī)支持5G網(wǎng)絡(luò)呢

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

    Linux和UNIX的GCC命令大全

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

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

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

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

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

    gcc的編譯選項總結(jié)

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

    tcpdump常用選項參數(shù)詳細(xì)總結(jié)

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

    認(rèn)識一下幾個常用的門級電路

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

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

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

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

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