Linux下靜態庫的生成以及使用例項圖解

readyao發表於2015-12-08

首先介紹一些gcc常用的選項:

作用

-o

產生目標(.i、.s、.o、可執行檔案等)

-c

通知gcc取消連結步驟,即編譯原始碼並在最後生成目標檔案

-E

只執行C預編譯器

-S

告訴編譯器產生組合語言檔案後停止編譯,產生的組合語言副檔名為.s

-Wall

使gcc對原始檔的程式碼有問題的地方發出警告

-Idir

將dir目錄加入搜尋標頭檔案的目錄路徑

-Ldir

將dir目錄加入搜尋庫的目錄路徑

-llib

連結lib庫

-g

在目標檔案中嵌入除錯資訊,以便gdb之類的除錯程式除錯


靜態庫(.a):程式在編譯連結的時候把庫的程式碼連結到可執行檔案中。程式執行的時候將不再需要靜態庫;


靜態庫的生成:用myprint.h 和 myprint.c 生成靜態庫libmyprint.a,然後用main.c使用該靜態庫;

myprint.h

void myprint(int num);

myprint.c

#include <stdio.h>

void myprint(int num)
{
	printf("my num is %d\n", num);	
}

main.c

#include<stdio.h>
#include "myprint.h"

int main()
{
	myprint(100);
	myprint(1000);

	return 0;
}

第一步:生成myprint.o檔案;使用命令,gcc  -c  myprint.c    -o   myprint.o


第二步:將生成的myprint.o檔案打包成靜態庫myprint.a檔案;使用命令 ar  rcs  libmyprint.a  myprint.o


可以使用命令file 檔案檢視檔案型別;使用命令nm 檢視靜態庫中的函式名稱;


此時已經生成了靜態檔案libmyprint,可以將myprint.c檔案刪除;myprint.o也沒有用了,也刪除;

第三步:使用生成的靜態庫;

如果直接輸入命令gcc  main.c  -o main 會提示錯誤,沒有連結靜態庫,所以會報錯


用-l來連結靜態庫;輸入命令gcc  main.c  -o main -lmyprint 結果還是報錯,沒有找到該庫檔案,應該指定庫檔案的路徑; 


用-L來指定當前路徑;輸入命令gcc  main.c  -o main -lmyprint  -L.;執行成功,生成了可執行檔案main,執行main正常;



如果我把myprint.h放在inc目錄下,把myprint.c, main.c放在src目錄下;將生成的靜態庫libmyprint.a放在lib目錄下;將生成的可執行檔案main放在bin目錄下;

第一步:生成myprint.o檔案到lib目錄下;


第二步:生成myprint.a靜態庫檔案到lib目錄下;


此時myprint.c和myprint.o已經沒有用了;

第三步:使用靜態庫生成可執行檔案main到目錄bin下;注意需要用-I指定標頭檔案目錄


相關文章