gcc命令常用选项参数详解
gcc是GUN C和C++編譯器,我們通常使用GCC時(shí),編譯器會(huì)依次做如下工作:preprocess(預(yù)處理),compilation(編譯),assembly(匯編),link(鏈接)。gcc提供了一些選項(xiàng)參數(shù)能夠讓編譯器停在某個(gè)過(guò)程(如編譯過(guò)程),比如 -c選項(xiàng)表示只走到“匯編”這一步,生成的是匯編后的目標(biāo)文件。本文主要介紹gcc常用的選項(xiàng)參數(shù)及其作用。
1.-c 對(duì)源代碼進(jìn)行預(yù)處理、編譯、匯編,但不執(zhí)行鏈接,產(chǎn)生的是源代碼的目標(biāo)文件(*.o)
2.-S 對(duì)源代碼進(jìn)行預(yù)處理、編譯,不執(zhí)行匯編、鏈接工作,有時(shí)我們想查看源代碼的匯編代碼,可以通過(guò)-S 選項(xiàng)實(shí)現(xiàn)。
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,"",@progbits3. -E 僅對(duì)源代碼進(jìn)行預(yù)處理(比如替換宏),這個(gè)選項(xiàng)不會(huì)像之前一樣產(chǎn)生一個(gè)文件,而是直接將結(jié)果輸出到屏幕。
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; }可以通過(guò)重定向?qū)⒔Y(jié)果定向到文件。
jie$ gcc -E test.c > test.e4.-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.1400005.-v 將編譯過(guò)程中運(yùn)行細(xì)節(jié)顯示在屏幕上(錯(cuò)誤輸出stderr),可以將編譯器的每步工作細(xì)節(jié)都展現(xiàn)出來(lái)。
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.o6**.-Wall 使GCC產(chǎn)生盡可能多的警告信息**
警告信息雖然不能算作錯(cuò)誤,但卻很可能成為錯(cuò)誤的來(lái)源。一個(gè)好的程序員應(yīng)該盡量避免產(chǎn)生警告信息,使自己的代碼始終保持標(biāo)準(zhǔn)、健壯。所以應(yīng)將警告信息當(dāng)成編碼錯(cuò)誤來(lái)對(duì)待。
如果在編譯程序時(shí)帶上-Werror選項(xiàng),那么GCC會(huì)在產(chǎn)生警告時(shí)停止編譯
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 148. -L 指定庫(kù)文件目錄,假定在/home/jie/lib目錄下動(dòng)態(tài)庫(kù)文件libadd.so和靜態(tài)庫(kù)文件libadd.a。
$ gcc -o my_test –L /home/jie/lib -static –ladd –o foo test.c-l選項(xiàng)指示GCC去鏈接靜態(tài)庫(kù)文件libadd.a。Linux下的庫(kù)文件命名有一個(gè)約定,即庫(kù)文件以lib三個(gè)字母開(kāi)頭,因?yàn)樗械膸?kù)文件都遵循這個(gè)約定,故在用-l選項(xiàng)指定鏈接的庫(kù)文件名時(shí)可以省去lib三個(gè)字母。Linux下的庫(kù)文件分為動(dòng)態(tài)鏈接庫(kù)(.so文件)和靜態(tài)鏈接庫(kù)(.a文件)。GCC默認(rèn)為動(dòng)態(tài)庫(kù)優(yōu)先,若想在動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)同時(shí)存在的時(shí)候鏈接靜態(tài)庫(kù)需要指明為
-static選項(xiàng)。
這里順便補(bǔ)充一下庫(kù)鏈接時(shí)搜索路徑順序:
靜態(tài)庫(kù):
1. ld會(huì)先搜索GCC命令中-L指定的目錄
2. 再搜索gcc的環(huán)境變量LIBRARY_PATH
3. 再搜索目錄 /lib /usr/lib /usr/local/lib
動(dòng)態(tài)庫(kù):
1. 編譯目標(biāo)代碼時(shí)-L指定的目錄
2. 環(huán)境變量LD_LIBRARY_PATH指定的動(dòng)態(tài)庫(kù)搜索路徑
3. 配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑
4. 默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib
5. 默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/usr/lib
有關(guān)環(huán)境變量:
LIBRARY_PATH環(huán)境變量:指定程序靜態(tài)鏈接庫(kù)文件搜索路徑
LD_LIBRARY_PATH環(huán)境變量:指定程序動(dòng)態(tài)鏈接庫(kù)文件搜索路徑
9.-std= 指定語(yǔ)言標(biāo)準(zhǔn)
10.代碼優(yōu)化選項(xiàng)
GCC提供不同等級(jí)的代碼優(yōu)化功能。開(kāi)關(guān)選項(xiàng)是:-On,n取值為0到3。默認(rèn)為1。-O0表示沒(méi)有優(yōu)化,而-O3是最高優(yōu)化。優(yōu)化級(jí)別越高代碼運(yùn)行越快,但并不是所有代碼都能夠加載最高優(yōu)化,而應(yīng)該視具體情況而定。但一般都使用-O2選項(xiàng),因?yàn)樗趦?yōu)化長(zhǎng)度、編譯時(shí)間和代碼大小之間,取得了一個(gè)比較好的平衡點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的gcc命令常用选项参数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小程序授权登录流程详情步骤
- 下一篇: 网络工程人的自我介绍