深入理解預編譯,編譯,彙編,連結的過程——之編譯和使用(連結)庫——物件和靜態庫
當你完成了程式碼開發,想把這個程式碼給別人用,但是又不希望別人看到原始碼,就要給別人一個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。
或者過程相反,你從別人那裡拿到一個庫和標頭檔案來使用。
那麼如何編譯生成一個庫給他人,如何使用從他人那裡拿到的庫呢?
範例1:我們想把LinuxFrame.c和LinuxFrame.h這兩個檔案生產庫給使用者
#LinuxFrame.c
#include "stdio.h"
#include "LinuxFrame.h"
void LoadBootCodeFromExDisk();
//ORG 0x30000
void startkernel(){
LoadBootCodeFromExDisk();
}
void LoadBootCodeFromExDisk()
{
printf("abcdefg\n");
}
#LinuxFrame.h
#ifndef ____LinuxFrame__
#define ____LinuxFrame__
#include <stdio.h>
void startkernel();
#endif /* defined(____LinuxFrame__) */
一、物件檔案
利用如下方法
#gcc -c LinuxFrame.c
生成一個物件檔案LinuxFrame.o。把這個LinuxFrame.o檔案和LinuxFrame.h檔案提供給使用者。
使用者使用如下main.c程式就可以呼叫LinuxFrame.c中的startkernel函式,從而使用startkernel功能。
#main.c
#include "LinuxFrame.h"
int main()
{
startkernel();
}
使用方法如下:#gcc -o main main.c LinuxFrame.o
於是就可以生成一個可執行檔案main。
注意main.c中使用了LinuxFrame.h,在連結的時候使用了LinuxFrame.o。
那麼看起來LinuxFrame.o就可以了,為什麼還要庫呢?
一、生成庫檔案
以下指令會把LinuxFrame.o生成LinuxFrame.a。.a的意思是archive,是檔案的意思。
#ar cr LinxFrame.a LinuxFrame.o
使用者拿到你的LinuxFrame.a和LinuxFrame.h後,可以用這樣的方法來生成可執行檔案main使用:
#gcc -o main main.c LinuxFrame.a
上述語句生產可執行檔案main。
執行main
#./main
輸出
#abcdefg
這樣看起來LinuxFrame.a和LinuxFrame.o是一樣的。
但是庫檔案比物件檔案功能還強大一點,比如還有一個c檔案fs.c
#fs.c
#include "stdio.h"
#include "LinuxFrame.h"
void createfs(){
printf("file system\n");
}
你可以$ gcc -c fs.c
再生產一個fs.o物件檔案。 然後$ar -r LinuxFrame.a LinuxFrame.o fs.o
生成一個庫檔案LinuxFrame.a 把原來的main.c改成: #main.c#include "LinuxFrame.h"
int main()
{
startkernel();
fs();
}
然後:$gcc -o main main.c LinuxFrame.a
這個時候生產可執行檔案main
$./main
輸出
$abcdefg
$file system
庫檔案相比.o檔案的好處是庫檔案可以包含很多個.o檔案。