深入理解预编译,编译,汇编,链接的过程——之编译和使用(链接)库——对象和静态库

来源:互联网 发布:创建视图的sql语句实例 编辑:程序博客网 时间:2024/06/03 23:43

当你完成了代码开发,想把这个代码给别人用,但是又不希望别人看到源码,就要给别人一个库和头文件,库和头文件是配合的,缺一不可。

或者过程相反,你从别人那里拿到一个库和头文件来使用。

那么如何编译生成一个库给他人,如何使用从他人那里拿到的库呢?

范例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文件。


0 0
原创粉丝点击