文档章节

Head First C 学习日志 第八章 静态库与动态库 静态库的创建与使用

AlexTuan
 AlexTuan
发布于 2016/04/01 12:57
字数 507
阅读 26
收藏 2

Head First C 学习日志 第八章 静态库与动态库

静态库:

静态库是1个或者一组目标文件.o的归档,在链接阶段使用,生成一个可执行文件。 静态库引入的原因是,当你的程序由多个源文件构成,而你想共享.o文件,当然你可以将所有的.o都共享,但是这样实在不方便,于是我们就将1个活多个.o文件,归档为1个.a 静态库文件

创建一个静态库:
  1. 将原文件编译为.o文件 gcc yourcode.c -c
  2. 使用.o文件创建静态库:ar -rcs libhfsec.a encrypt.o checksum.o
    • 命令ar表示归档
    • rcs:r表示如果.a文件存在就更新它,c表示存档时不显示反馈信息,s表示告诉ar在.a文件开头创建索引。
    • libhfsec.a:这是我们要创建的静态库文件,注意一定要以libxxx.a命名。
    • encrypt.o checksum.o:这是我们要归档的.o文件。
  3. 使用静态库文件gcc testrun.c -L/Users/AlexTuan/HFC/lib/stlib -lhfsec -o testrun
    • testrun.c:是我们的main函数所在的源文件
    • -L/Users/AlexTuan/HFC/lib/stlib:-L表示,指定静态库文件所在的目录,目录可以用绝对路径和相对路径,不指定则从系统默认的静态库路径查找。
    • -lhfsec:指定我们要使用的静态库libhfsec.a,这就是我们要以libxxx.a格式命名的原因,可以用-lxxx的方式来指定我们的静态库。
  4. 使用make自动构建
encrypt.o:encrypt.c encrypt.h
	gcc -c encrypt.c
checksum.o:checksum.c checksum.h
	gcc -c checksum.c
testrun.o:testrun.c
	gcc -c testrun.c
libhfsec.a:encrypt.o checksum.o
	ar -rcs stlib/libhfsec.a encrypt.o checksum.o
testrun:testrun.o libhfsec.a
	gcc testrun.o -L./stlib -lhfsec -o testrun
要点
  1. 一个库有多个目标文件
  2. 使用ar命令创建静态库
  3. 静态库命名要以libxxx.a的格式,调用时直接-lxxx
代码

lib sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 第八章 静态库与动态库 创建动态库

Head First C 第八章 静态库与动态库 创建动态库 动态库是什么 静态库文件,需要在链接过程中和主程序链接在一起,如果你想改变某个部分的功能,或者发布不同版本,就需要修改这个代码并全部...

AlexTuan
2016/04/02
38
0
从零开始UNIX环境高级编程(7):进程环境

0. 引言 在学习进程控制前,先了解进程运行的环境,如:main函数是如何被调用的;命令行参数是如何传递给新程序的;程序在内存空间中是什么样的结构;进程的终止方式等。 1. main函数 1.1 程...

伤口不该结疤
2017/04/24
0
0
Linux下gcc生成和使用静态库和动态库详解

一、基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的平台不同(主要是编...

lwaif
2018/01/13
81
0
静态库与共享库制作与应用

1、什么是库 在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼...

长平狐
2012/09/03
255
0
在Linux中创建静态库和动态库范例 (hello.c)

我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不...

AlphaJay
2010/05/31
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
11分钟前
2
0
正则表达式大全

检验手机号码 # 要求:手机号码必须为11位数字,以1开头,第二位为1或5或8。import redef verify_mobile(): mob = input("请输入手机号码:") ret = re.match(r"1[358]\d{9}", m......

彩色泡泡糖
14分钟前
2
0
QT之border-image属性

一、border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人。可惜目前支持的浏览器有限,仅Firefox3.5,chrome浏览器,Safari3+支持...

shzwork
15分钟前
2
0
Kubernetes Operator简易教程

1. 安装operator-sdk //安装 operator-sdk$ apt-get install operator-sdk.....$ operator-sdk versionoperator-sdk version: v0.7.0$ go versiongo version go1.11.4 darwin/amd64 2......

Robotcl_Blog
15分钟前
3
0
再谈DAG任务分解和Shuffle RDD

1、DagScheduler分析 DagScheduler功能主要是负责RDD的各个stage的分解和任务提交。Stage分解是从触发任务调度过程的finalStage开始倒推寻找父stage,如果父stage没有提交任务则循环提交缺失...

守望者之父
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部