Linux開發工具之gcc

一.gcc入門(上)
  1.gcc相關概念
  gcc(GNU C Compiler)編譯器,最初支持C語言,現已支持C、C++、Java、 Pascal、Ada、COBOL語言等;支持多種硬件平臺;
  gcc不單單是本地編輯器,他還能跨平臺交叉編譯;
  gcc有多重語言前端,用於解析不一樣的語言;
  gcc是模塊化設計的,能夠加入新語言和新CPU架構的支持;
  gcc是自由軟件;
  2.gcc編譯程序過程示意圖
hello.c-->預處理(cpp)hello.i-->編譯器(ccl)hello.s-->彙編器(as )hello.o,printf.o-->連接器(ld)hello
源程序(文本)->被修改的源程序(文本)->彙編程序(文本)->可重定位目 標程序(二進制)->可執行目標程序(二進制)
#gcc -E(預處理宏定義的展開) hello.c -o hello.i(目標文件)
#gcc -s(編譯) hello.i -o hello.s
#gcc -c(彙編) hello.s -o hello.o(通知gcc取消連接步驟,即編譯源碼並 在最後生成目標文件)
#gcc hello.o -o hello
#./hello
hello
一次完成
#gcc hello.c -o hello
#gcc -c hello.c(只到第三步,不參加連接)
3.-Wall的使用,防止產生預期的錯誤,出錯提醒
#gcc -Wall hello.c -o hello
正確的狀況下不提示,錯誤提醒
4.模塊化編譯:
#include<stdio.h>
void hellofn();
void main();
兩個函數文件的編譯連接
#gcc -Wall hellofn.c main.c -o man
#ls
main
#./main
hello
一樣也能夠,將兩個文件都生成連接文件,連接生成目標文件
#gcc -Wall -c hellofn.c -o hellofn.o
#gcc -Wall -c main.c -o main.o
#gcc -Wall hellofn.o main.o -o main
#ls
main
#./main
hello
若是其中一個文件發生改變,只須要編譯一部分便可;
若是工程中有許多,獨立編譯的文件,則須要創建makfile的腳本進行大規 模的編譯;
小結:
gcc的概念
gcc的特色
gcc編譯過程
gcc經常使用選項
gcc編譯多文件
2、gcc入門(下)
01.頭文件與庫文件
  在使用c語言和其餘語言進行程序設計的時候,咱們須要頭文件來提供對常數 的定義和對系統函數庫調用的聲明。
  庫文件是一些預編譯好的函數集合,哪些函數都是按照可重用原則編寫。 它們一般由一組相關聯的用來完成某項常見工做的函數構成。好比用來處理 屏幕顯示狀況的函數(ncurses庫)和數據庫訪問例程(dbm庫)等。
02.使用外部庫(-l選項)
//calc.c
#include<math.h>
#include<stdio.h>
int main(void)
{
double x = pow(2.0,3.0);
printf("The cubed is %f\n",x);
return 0;
}
#gcc -Wall calc.c -o calc -lm
#ls /usr/lib/libm.a
#ls  /usr/lib/libm.so
03.靜態庫與共享庫
靜態庫(.a):程序在編譯連接的時候把庫的代碼連接到可執行文件中。程 序在運行的時候將再也不須要靜態庫。
動態庫(.so或.sa):程序在運行的時候纔去連接共享的代碼,多個程序共享 使用庫的代碼。
 一個與共享庫連接的可執行文件僅僅包含它用到的函數入口地址的一個表 ,而不是外部函數所在目標文件的整個機器碼。
  在可執行文件開始運行之前,外部函數的機器碼有操做系統從磁盤上的該 共享庫中複製到內存中,這個過程稱爲動態連接(dynamic linking)
  共享庫能夠在多個程序間共享,全部動態連接使用得可執行文件更小,節 省了磁盤空間。操做系統採用虛擬內存機制容許物理內存中的一根共享庫被 要用到該庫的全部進程公用,節省了內存和磁盤空間。
04.生成靜態庫
ar(gnu歸檔工具) rcs(replace and create)
例如:#ar rcs libhello.a hello_fn.o
#gcc -Wall main.c libhello.a -o main
#./main
hello world!!!
#gcc -Wall main.o -o main -lhello(libhello可簡寫爲lhello)
/usr/bin/ld:cannot find -lhello
#gcc -Wall -L.(在當前路徑下查找lhello這個庫)
在連接生成main可執行文件後,lhello.a靜態庫文件能夠刪除
#rm lhello.a
#./main
hello world!!!
#vi ~/.bash_profile
export LIBRARY PATH = /(指定環境變量,到該目錄下搜索庫)
05.生成共享庫
shared:表示生成共享庫格式
fPIC:產生位置無關碼(position independent)
#gcc -shared -fPIC hello_fn.o -o libhello.so
#ls
libhello.so
#gcc -Wall -L. main.o -o main -lhello
(靜態庫與共享庫同時存在時,優先調用共享庫)
#cp main /tmp
#./main
./main error:……
第一種方法:
#cp libhello.so /usr/lib
#./main
hello world!!!
第二種方法:更改LD_LIBRARY_PATH(當前用戶)
#vi ~/.bash_profile
增長該文件路徑
第三種方法:ldconfig,配置ld.so.conf,ldconfig更新ld.so.cache
#vi /etc/ld.so.conf
(修改路徑)
#ldconfig(更新命令)
#ldd main
(main程序包含了哪些庫)
#ldd hello
(hello包含了哪些庫)
小結:
使用外部庫:-lhello
靜態庫與共享庫:三種方法
生成靜態庫
生成動態庫
相關文章
相關標籤/搜索