gcc有哪些常用選項,今天,就來給大家盤點一下。
-E表示預處理,處理所有以井號鍵開頭的代碼,常見的比如把頭文件展開。
hello.c
#include預處理:int main() { printf("helloworld "); return 0; }
gcc -E hello.c -o hello.i預處理后的文件:
# 1 "hello.c" # 1 "-S表示編譯,把C文件變成匯編文件。" # 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 .....
還是使用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打開后是這樣:
?
-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不優(yōu)化:#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; }
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
+關注
關注
0文章
105瀏覽量
24804 -
VIM
+關注
關注
0文章
134瀏覽量
15261
原文標題:gcc常用選項盤點
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
不常見但是很有用的 gcc 命令行選項
一些特殊的警告嗎?gcc 的很多命令行選項都不會經常用到,但是它們在某些特定的情況下會變得非常有用,例如,當你在調試代碼的時候。所以在本文中
發(fā)表于 12-31 11:08
嵌入式Linux工具之GCC常用編譯選項
“-I dir”選項可以在頭文件的搜索路徑列表中添加 dir 目錄。由于 Linux 中頭文件都默認放到了“/usr/include/”目錄下,因此,當用戶希望添加放置在其他位置的頭文件時,就可以通過“-I dir”選項來指定,這樣,g
盤點一下哪些手機支持5G網絡呢
隨著5G網絡的推廣,各大廠商也開始陸續(xù)推出支持5G網絡的手機。今天為大家盤點一下,究竟哪些手機支持5G網絡呢。
Linux系統(tǒng)下Gcc的基本用法和選項
在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數
發(fā)表于 08-20 09:57
?1254次閱讀
gcc的編譯選項總結
本文用于記錄我在學習和工作中遇到的各種GCC選項,雖然這些選項可以在GNU的手冊上查到,不過這里做個總結,可以避免每次都去查手冊,算是一個備忘吧。本文的內容會不斷更新擴充。
tcpdump常用的選項參數詳細總結
常用選項通過上述的實戰(zhàn)案例,相信大家已經掌握的 tcpdump 基本用法,在這里來詳細總結一下常用的選項參數。 (
盤點一下高通CES 2024汽車創(chuàng)新技術
在CES2024上,我們看到英特爾和AMD加入,加上原來的英偉達,高通需要和這些跨行的對手在一個賽道卷,目前高通在數字座艙、云連接、人工智能和自動駕駛領域是有一定的積累的,我們來盤點
評論