日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc命令常用选项参数详解

發布時間:2024/3/24 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc命令常用选项参数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gcc是GUN C和C++編譯器,我們通常使用GCC時,編譯器會依次做如下工作:preprocess(預處理),compilation(編譯),assembly(匯編),link(鏈接)。gcc提供了一些選項參數能夠讓編譯器停在某個過程(如編譯過程),比如 -c選項表示只走到“匯編”這一步,生成的是匯編后的目標文件。本文主要介紹gcc常用的選項參數及其作用。
1.-c 對源代碼進行預處理、編譯、匯編,但不執行鏈接,產生的是源代碼的目標文件(*.o)

jie$ vi test.c jie$ cat test.c #include <stdio.h> #define PI 3.14 int main() {printf("%f\n",PI);return 0; } jie$ gcc -c test.c jie$ ls test.c test.o

2.-S 對源代碼進行預處理、編譯,不執行匯編、鏈接工作,有時我們想查看源代碼的匯編代碼,可以通過-S 選項實現。

jie$ cat test.c #include <stdio.h> #define PI 3.14 int main() {printf("%f\n",PI);return 0; } jie$ gcc -S test.c jie$ ls test.c test.s jie$ file test.s test.s: assembler source, ASCII text jie$ cat test.s.file "test.c".section .rodata .LC1:.string "%f\n".text.globl main.type main, @function main: .LFB0:.cfi_startprocpushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovabsq $4614253070214989087, %raxmovq %rax, -8(%rbp)movsd -8(%rbp), %xmm0movl $.LC1, %edimovl $1, %eaxcall printfmovl $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc .LFE0:.size main, .-main.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609".section .note.GNU-stack,"",@progbits

3. -E 僅對源代碼進行預處理(比如替換宏),這個選項不會像之前一樣產生一個文件,而是直接將結果輸出到屏幕。

jie$ cat test.c #include <stdio.h> #define PI 3.14 int main() {printf("%f\n",PI);return 0; } jie$ gcc -E test.c ....... ....... ....... int main() {printf("%f\n",3.14);return 0; }

可以通過重定向將結果定向到文件。

jie$ gcc -E test.c > test.e

4.-D 定義宏,與源代碼中#define指令定義的宏效果一樣。

jie$ cat test.c #include <stdio.h> int main() {printf("%f\n",PI);return 0; } jie$ gcc -DPI=3.14 -o my_test test.c jie$ ./my_test 3.140000

5.-v 將編譯過程中運行細節顯示在屏幕上(錯誤輸出stderr),可以將編譯器的每步工作細節都展現出來。

jie$ gcc -v -o my_test test.c Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccddEK9Q.s GNU C11 (Ubuntu 5.4.0-6ubuntu1~16.04.4) version 5.4.0 20160609 (x86_64-linux-gnu)compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3 GGC heuristics: --param ggc-min-expand=96 --param ggc-min-heapsize=124542 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here:/usr/lib/gcc/x86_64-linux-gnu/5/include/usr/local/include/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/usr/include/x86_64-linux-gnu/usr/include End of search list. GNU C11 (Ubuntu 5.4.0-6ubuntu1~16.04.4) version 5.4.0 20160609 (x86_64-linux-gnu)compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3 GGC heuristics: --param ggc-min-expand=96 --param ggc-min-heapsize=124542 Compiler executable checksum: 78b6f8b2ed219a71c67c16db887e4800 COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'as -v --64 -o /tmp/ccbIpzZI.o /tmp/ccddEK9Q.s GNU assembler version 2.26.1 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.26.1 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccDLPQRA.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o my_test /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/ccbIpzZI.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

6**.-Wall 使GCC產生盡可能多的警告信息**
警告信息雖然不能算作錯誤,但卻很可能成為錯誤的來源。一個好的程序員應該盡量避免產生警告信息,使自己的代碼始終保持標準、健壯。所以應將警告信息當成編碼錯誤來對待。
如果在編譯程序時帶上-Werror選項,那么GCC會在產生警告時停止編譯

gcc -Wall -o test test.c gcc -Werror -o test test.c

7.-I 指定頭文件包含目錄

jie$ tree . . ├── header │ └── add.h ├── source │ └── add.c └── test.c jie$ cat test.c #include <stdio.h> #include "add.h" #define PI 3.14 int main() {printf("%f\n",PI);printf("%d\n",add(6,8));return 0; } jie$ cat ./header/add.h int add(int a,int b); jie$ cat ./source/add.c int add(int a,int b) {return a+b; } jie$ gcc test.c ./source/add.c test.c:2:17: fatal error: add.h: No such file or directory compilation terminated. jie$ gcc -I ./header/ test.c ./source/add.c jie$ ls a.out header source test.c jie$ a.out 3.140000 14

8. -L 指定庫文件目錄,假定在/home/jie/lib目錄下動態庫文件libadd.so和靜態庫文件libadd.a。

$ gcc -o my_test –L /home/jie/lib -static –ladd –o foo test.c

-l選項指示GCC去鏈接靜態庫文件libadd.a。Linux下的庫文件命名有一個約定,即庫文件以lib三個字母開頭,因為所有的庫文件都遵循這個約定,故在用-l選項指定鏈接的庫文件名時可以省去lib三個字母。Linux下的庫文件分為動態鏈接庫(.so文件)和靜態鏈接庫(.a文件)。GCC默認為動態庫優先,若想在動態庫和靜態庫同時存在的時候鏈接靜態庫需要指明為
-static選項。
這里順便補充一下庫鏈接時搜索路徑順序:
靜態庫:
1. ld會先搜索GCC命令中-L指定的目錄
2. 再搜索gcc的環境變量LIBRARY_PATH
3. 再搜索目錄 /lib /usr/lib /usr/local/lib
動態庫:
1. 編譯目標代碼時-L指定的目錄
2. 環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
3. 配置文件/etc/ld.so.conf中指定的動態庫搜索路徑
4. 默認的動態庫搜索路徑/lib
5. 默認的動態庫搜索路徑/usr/lib
有關環境變量:
LIBRARY_PATH環境變量:指定程序靜態鏈接庫文件搜索路徑
LD_LIBRARY_PATH環境變量:指定程序動態鏈接庫文件搜索路徑
9.-std= 指定語言標準

$ gcc -o my_test -std=c90 test.c jie$ ls my_test test.c jie$ ./my_test 3.140000

10.代碼優化選項
GCC提供不同等級的代碼優化功能。開關選項是:-On,n取值為0到3。默認為1。-O0表示沒有優化,而-O3是最高優化。優化級別越高代碼運行越快,但并不是所有代碼都能夠加載最高優化,而應該視具體情況而定。但一般都使用-O2選項,因為它在優化長度、編譯時間和代碼大小之間,取得了一個比較好的平衡點。

總結

以上是生活随笔為你收集整理的gcc命令常用选项参数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。