深入理解预编译,编译,汇编,链接的过程——之编译和使用(链接)库——对象和静态库
来源:互联网 发布:创建视图的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#include "LinuxFrame.h"
int main()
{
startkernel();
fs();
}
然后:$gcc -o main main.c LinuxFrame.a
这个时候生产可执行文件main
$./main
输出
$abcdefg
$file system
库文件相比.o文件的好处是库文件可以包含很多个.o文件。
- 深入理解预编译,编译,汇编,链接的过程——之编译和使用(链接)库——对象和静态库
- 深入理解预编译,编译,汇编,链接的过程——之编译和使用(链接)库——动态库
- 深入理解预编译,编译,汇编,链接的过程——之链接
- 深入理解预编译,编译,汇编,链接的过程——之预编译
- 深入理解预编译,编译,汇编,链接的过程——之编译
- 深入理解预编译,编译,汇编,链接的过程——之汇编
- gcc——预处理(预编译),编译,汇编,链接
- 程序的预编译,编译,汇编,链接过程
- 预编译,编译,汇编,链接
- 程序编译-汇编-链接的理解!—03-ELF头和节头表
- 链接、装载与库—编译和链接(2.4)
- 静态链接的编译过程和链接过程
- GCC 编译使用动态链接库和静态链接库
- G++ 编译使用动态链接库和静态链接库
- GCC 编译使用动态链接库和静态链接库
- gcc 编译使用动态链接库和静态链接库
- GCC 编译使用动态链接库和静态链接库
- GCC 编译使用动态链接库和静态链接库
- 加载Spring上下文环境ApplicationContextAware
- 关于跳空缺口
- iphone6 2招电量使用延长一般
- 获得当前时间差
- Metal Tips and Techniques
- 深入理解预编译,编译,汇编,链接的过程——之编译和使用(链接)库——对象和静态库
- AutoLayout使用总结のMasonry
- JavaScript获取DOM元素位置和尺寸大小
- Greenplum数据仓库简介
- 优秀IT技术文章集
- adb 命令
- LeetCode(97) Interleaving String解题报告
- Spring注入.properties文件
- 一个菜鸟的心理历程