1. 程式人生 > >linux C程式設計(一)gcc的用法

linux C程式設計(一)gcc的用法

C/C++的編譯環境:make工具,編譯器gcc,偵錯程式gdb,C/C++標準庫。常用庫資訊列表build-essential包含gcc,g++,make,libc6-dev等寫程式時基本會用到的工具,因此只安裝build-essential,gcc,make等工具也會自動安裝。不清楚的話全部都apt-get即可。


sudo apt-get install gdb build-essential
裝完以後,檢視gcc,make,gdb等版本


[email protected]:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04.3' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --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-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-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 --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 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)

[email protected]:~$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu


本文重點講述gcc

二.g++與gcc的區別

gcc,全稱:GNU Compile Collection,是一組編譯器集合,可以編譯c,c++,object-c,java等。其功能是實現一個原始碼檔案向可執行檔案的轉換。

g++等效於 gcc -xc++ -lstdc++ -shared -libgcc

其中-x選項是指定gcc編譯器的編譯語言,由上述等價關係可知,

gcc對於不同的檔案,可根據其後綴名採用不同編譯規則,如.c,.cpp檔案,而g++是將所有檔案都當做c++來進行編譯

由上述可知只需要gcc即可

三.細說gcc

gcc的對於hello.c編譯流程分為四部分:

(1)預處理(Pre-Processing) hello.c -> hello.i 替換巨集及標頭檔案等

(2)編譯(Compile) hello.i -> hello.s  將.c程式碼轉為彙編程式碼

(3)彙編(Assembler) hello.s ->hello.o 將彙編程式碼轉為二進位制程式碼,該二進位制程式碼中可能會引用其他.c或庫裡的函式,但是隻是一個標誌,沒有具體的位置

(4)連結(Link) hello.o -> hello 將hello.o裡引用的其他地方的函式和其他.c檔案對應的.o全部連結為一個科執行檔案

在連結外部庫的時候有兩種方式,一種是連結動態庫.so(shared object),一種是靜態庫.a(Archive),gcc -static 此選項會禁止使用動態庫,因此編譯完後的檔案一般會比較大,執行時也不需要動態庫;gcc -share將盡量使用動態庫,生成檔案較小,但執行時會需要動態庫。

在指定-llib編譯原始檔時,預設為shared引數,即預設為查詢lib.so的共享庫,編譯時不講lib連結進去;若顯式指定-static引數,則首先查詢lib.a靜態庫,然後編譯時將靜態庫裡的函式連結進去!

其餘常用gcc選項:

-c 啟用前三步,生成.o檔案 如gcc -c hello.c

-o 指定目標名稱,如gcc -c hello.c -o hello.o

-Wall 顯示警告資訊

-O0 -O1 -O2 -O3 編譯器的優化選項,-O0表示沒有優化,-O1為default值,-O3優化級別最高

-llibrary 指定連結時使用library庫,如gcc  hello.c -o hello -lcurses 表示將hello.c編譯連結為hello可執行檔案,且連結的庫使用libcurses.so庫

-Ldir 指定連結時尋找庫檔案的路徑,否則gcc只會在預設的幾個路徑中尋找庫(如/usr/lib等),一般用在使用自己的庫或者第三方庫時會使用

-include file指定編譯某個.c時包含file標頭檔案,其功能相當於在.c前端#include file

-Idir 指定編譯某個.c時先在dir資料夾裡尋找標頭檔案,然後再去預設目錄尋找

linux預設系統路徑

標頭檔案:/usr/include/  /usr/local/include/

庫檔案:/usr/lib/  /usr/local/lib/

-Dmacro 在編譯該檔案時定義macro巨集

-Dmacro=defn 在編譯該檔案時定義macro巨集=defn

-Umacro 在編譯該檔案時undef macro

-x language filename 設定檔案所使用的語言,language可為c,c++等
--------------------- 
作者:遍地流金 
來源:CSDN 
原文:https://blog.csdn.net/u012177034/article/details/52104995 
版權宣告:本文為博主原創文章,轉載請附上博文連結!