Yuchuan_Linux_C 编程之三 静态库的制作和使用
一、整体大纲

二、静态库的制作
1)命名规则
lib + 库的名字 + .a
例如:libyuchuan.a
2)制作步骤:
1). 生成对应的.o文件 -- .c --> .o -c
2). 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o
3)发布和使用静态库:
1). 发布静态库
2). 头文件
4)优缺点:
三、静态库的打包
一. GCC的使用
1. GCC的编译过程

(1)预处理(cpp)gcc -E(输出问价通常以 .i 结尾),将头文件展开,宏替换等操作;
(2)编译器(gcc)gcc -S(输出问价以 .s 结尾)生成汇编代码;
(3)汇编器(as)gcc -c(输出文件以 .o 结尾)将汇编编译成二进制文件;
(4)连接器(ld)gcc,链接 lib 库生成可执行文件。
执行过程如下(hello.c):
#include<stdio.h> int main()
{
printf("hello world\n");
return ;
}
Linux执行过程:
[root@centos1 src]# gcc -E hello.c >> hello.i
[root@centos1 src]# gcc -S hello.i
[root@centos1 src]# gcc -c hello.s
[root@centos1 src]# gcc -o hello.out hello.o
[root@centos1 src]# ./hello.out
hello world
注:第4步如果使用 ld 会报如下错误
[root@centos1 src]# ld hello.o
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
hello.o: In function `main':
hello.c:(.text+0xa): undefined reference to `puts'
没有 __start 是因为C程序以main为主函数,汇编以start为主函数入口,改用gcc连接就可以,如果非用ld,需要自己链接libc.so库。
2. GCC编译参数
- -I 包含头文件路径(可以使绝对路径,也可以是相对路径)
- -O 优化选项,1-3越高优先级越高
- -L 包含的库路径
- -l(L的小写)指定库名(通常libxxx.so或者libxxx.a,-lxxx)
- -o 目标文件
- -c 编译成.o文件
- -g 用于gdb调试不加此选项不能gdb调试
- -Wall 显示更多的警告
- -D 指定宏编译
- -lstdc++ 编译c++代码
二. 动静库
1. 制作库文件作用
作用:将实现某部分功能的代码封装成库文件,以方便调用,或者是对代码进行保护加密。
应用场景:有时想将某代码提供给别人用,但是又不想公开源代码,这时可以将代码封装成库文件。在开发中调用其他人员编写的库。
2. 静态库
(1)制作步骤
1)编译.o文件
2)将.o文件打包:ar rcs libname.a file1.o file2.o file3.o ...
3)将头文件与库一起发布
文件内容及路径分布如下:
[root@centos1 calc]# tree
.
├── include
│ └── head.h
├── lib
├── main.c
└── src
├── add.c
└── sub.c
#include<stdio.h> int add(int a, int b);
int sub(int a, int b);
#include "head.h" int add(int a, int b)
{
return a + b;
} add.c
#include "head.h" int sub(int a, int b)
{
return a - b;
} sub.c
- 编译为.o文件
进入到 src 目录下执行:
[root@centos1 src]# gcc -c *.c -I ../include/
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o
- 将.o文件打包,制作成libCalc.a静态库
[root@centos1 src]# ar rcs libCalc.a *.o
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rw-r--r--. root root 4月 : libCalc.a
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o
(2)使用
编译时需要加静态库名(记得路径),-I 包含头文件
- 使用静态库编译main.c并执行main
我们将libCalc.a移动到上层的lib中并退回到calc目录,编译main.c并执行:
[root@centos1 calc]# gcc main.c -o main -I include/ -L ./lib -lCalc
[root@centos1 calc]# ll
总用量
drwxr-xr-x. root root 4月 : include
drwxr-xr-x. root root 4月 : lib
-rwxr-xr-x. root root 4月 : main
-rw-r--r--. root root 4月 : main.c
drwxr-xr-x. root root 4月 : src
[root@centos1 calc]# ./main
+ is
- is
可以用 nm 命令查看文件内容:
[root@centos1 calc]# nm lib/libCalc.a add.o:
T add sub.o:
T sub
(3)静态库优缺点
优点:
1)执行快
2)发布应用时不需要发布库
缺点:
1)执行程序体积会比较大
2)库变更时需要重新编译程序

Yuchuan_Linux_C 编程之三 静态库的制作和使用的更多相关文章
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS开发之静态库的制作
当你需要和别人分享代码,但又不想让别人看到你内部的实现时就需要制作静态库,通常用于第三方SDK 下面就分享一下制作静态库(.a)的过程: 1.打开Xcode,新建workspace 2.随便给work ...
- Win32编程之静态库编写与使用.动态链接库的编写与使用
Win32编程之静态库编写与使用.动态链接库的编写与使用 一丶什么是静态库.什么是动态链接库. 静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在 ...
- iOS静态库的制作与引用
[iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...
- iOS 静态库的制作
按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程. 在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下. 一.静态库和动态库的详细介绍. 我们平时的工程中或多或少都要引入第 ...
- Yuchuan_Linux_C 编程之四动态库(共享库)制作
一.整体大纲 二.共享库的制作 1. 命名规则: lib + 名字 + .so 2. 制作步骤: 1) 生成与位置无关的代码 (生成与位置无关的.o) 2) 将.o打包成共享库(动态库) 3. ...
- C 高级编程3 静态库与动态库
http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...
- iOS实用技能扩展-静态库的制作与简单使用
前言:此文是关于静态库的概念描述,如何制作及简单调试使用,不同版本的说明与场景使用. 1.关于库的简介: 库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetw ...
- 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
一 QT的内存管理 1 QT中的内存管理是QObject来管理的 2 QT中的内存管理没有cocos2dx中的引用计数 3 组件能够指定父对象 QTimer *timer = QTime ...
随机推荐
- bzoj1076 奖励关(概率dp)(状态压缩)
BZOJ 1076 [SCOI2008]奖励关 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须 ...
- 3.redis kyes命令
Keys命令 1.1设置key的生存时间 Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁. EXPIRE key seconds ...
- ADB命令-1
1.adb -s 指定设备号(用于已连接多个设备时) 2.adb install -r -t xxx 安装程序 3.adb pull 设备目录 本地目录 复制文件命令 4.adb push 向设 ...
- IE11阅读视图:带给你静心饕餮阅读大餐的片刻
编者按:又到读书日,今天你挤出时间读书了吗?如今,越来越多人在习惯电子阅读,然而总难逃眼花缭乱的干扰信息.Internet Explorer 11新增阅读视图功能,一键开启,给你带给你静心饕餮阅读大餐 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 标题
在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题. <h6 ...
- unittest(22)- p2p项目实战(2)-http_request
# 2. http_request.py import requests from learn_logging_5.write_log_class import MyLog my_logger = M ...
- 使用JS-SDK自定义微信分享效果
前言 刚进入一家新公司,接到的第一个任务就是需要需要自定义微信分享的效果(自定义缩略图,标题,摘要),一开始真是一脸懵逼,在网上搜索了半天之后大概有了方案.值得注意的是一开始搜索到的解决方案全是调用微 ...
- python基础之文件操作1
文件操作:os.mknod("test.txt") 创建空文件fp = open("test.txt",w) 直接打开一个文件,如果文件不 ...
- Django中加载static无法成功的解决方法
我试着进入/admin/ 结果它的/static/ 能够正常找到目标文件…真是日了哈*奇了. 我的link标签href=/static/…. 并没有什么问题 试着在urls中加入下面代码,但是没什么用 ...
- Python测试开发-创建模态框及保存数据
Python测试开发-创建模态框及保存数据 原创: fin 测试开发社区 前天 什么是模态框? 模态框是指的在覆盖在父窗体上的子窗体.可用来做交互,我们经常会看到模态框用来登录.确定等等,到底是怎 ...