Linux主程序子程序編譯,連接; makefile編寫和tarball程序管理

主程序子程序的編譯和連接

  • 主程序 hello.c
#include<stdio.h>⇠
int main(void)⇠
{⇠
    printf("Hello World\n");
    thanks();⇠
}⇠
  • 子程序 thanks.c
#include<stdio.h>⇠
void thanks(void)⇠
{⇠
    printf("Thanks\n");⇠
}⇠
  • 編譯
gcc -c hello.c thanks.c

-c 是免去連接,不然主程序調用 thanks那行會報錯。c++

-c 同時會自動生成 hello.o 與 thanks.obash

  • 連接
gcc -o main hello.o thanks.o

部分編譯

在上面的基礎上,假如咱們修改了 thanks.c, 咱們不須要所有從新編譯, 只須要生成新的thanks.o 再與其餘目標文件從新連接便可。 節省時間。函數

調用動態函數庫

記得用pthread寫程序的時候,編譯時總要在後面加上 -lpthread 選項,這是什麼緣由呢?
  • 寫一個程序
#include <stdio.h>⇠
int main()
{⇠
    float val;⇠
    val = sin (3.14/2);⇠
    printf("%f\n",val);⇠
}
  • 動態連接
gcc -o main lib.c -lm -L /lib -L /usr/lib
  • sin() 函數在 libm.so 函數庫當中,-lm的意思是 :
  • l: 連接函數庫 lib的意思
  • m: libm.so 去掉 lib 和 so後的部分。 由此能夠聯想到 pthread 應該在 libpthread.so
    函數庫當中定義。
    -L 指定函數庫的位置, 默認在/lib 和 /usr/lib 當中,因此不寫也不要緊。

靜態函數庫和動態函數庫

靜態函數庫

  • 擴展名 .a , 全名爲libxxx.a
  • 這類函數庫在編譯的時候就會整合到執行程序當中。
  • 函數庫的升級將致使全部包含它的程序的升級。

動態函數庫

擴展名 .so, 全名爲 libxxx.so
這類函數在編譯的時候只添加一個 函數庫的指針。在執行的時候才須要加載。
函數庫的升級不須要修改其餘程序。優化

動態函數庫解析

ldd xxx.o 能夠分析程序涉及哪些動態函數庫。指針

gcc 的經常使用選項

  • E : 預處理, 從 main.c 到 main.i 木的是加載靜態函數庫
  • -S: 編譯, 從 xxx.i 到 xxx.s 獲得彙編語言代碼。
  • c: 生成機器代碼 .o文件
  • -o: 連接, 生成可執行文件
  • -O[0:3] : 進行不一樣程度的優化。
  • -std=c99 : 支持 c99 標準
  • -std=c++11: 支持c++11
  • -Wall: 編譯更加嚴格
  • -g: 產生用於gdb調試的信息

make的使用

爲何使用make

假如咱們的一個項目又不少程序,這些程序相互引用,一些程序還使用到動態函數庫。那麼咱們編譯的時候將分不少步進行,特別麻煩。 當咱們須要從新編譯的時候,全部步驟仍是得從新來一遍。能不呢省略呢?調試

make的基本用法

target:  目標文件1  目標文件2  ...
<tab>    gcc -o  目標文件1  目標文件2

舉例說明

仍是以上面hello.c, thanks.c 爲例, 忘了的朋友能夠翻頁上去看一下。下面是咱們makefile:c++11

main:  hello.o  thanks.o
    gcc -o main hello.o thanks.o
clean:
    rm -f hello.o  thanks.o

能夠看到,我有兩個target,這兩個能夠在調用make的時候進行選擇:code

make main
make clean

其中:get

  • main : 是生成目標文件 main。
  • clean: 是用於清理生成的多餘的目標文件。
  • <tab> 是必須的,後面加命令。

makefile的優化

makefile當中也能夠進行變量的定義,能夠簡化makefile的編寫:源碼

OBJS = main.o thanks.o
main:
    gcc -o $@ ${OBJS}
clean:
    rm -f ${OBJS}
  • 與bash相似但優勢不一樣, 變量的定義中 ,'='兩邊能夠有空格。
  • $@ 表明當前target, 在這裏是 main

Tarball軟件的安裝

常常咱們須要經過源碼安裝軟件,那麼它們安裝的步驟是怎樣的呢?
  • ./configure: 用於生成 Makefile
  • make clean 用於清除以前的 目標文件
  • make 編譯
  • make install 將編譯完成的數據安裝到默認目錄中。
相關文章
相關標籤/搜索