1. 程式人生 > >深入理解預編譯,編譯,彙編,連結的過程——之編譯和使用(連結)庫——物件和靜態庫

深入理解預編譯,編譯,彙編,連結的過程——之編譯和使用(連結)庫——物件和靜態庫

當你完成了程式碼開發,想把這個程式碼給別人用,但是又不希望別人看到原始碼,就要給別人一個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。

或者過程相反,你從別人那裡拿到一個庫和標頭檔案來使用。

那麼如何編譯生成一個庫給他人,如何使用從他人那裡拿到的庫呢?

範例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檔案。