一、整体大纲

二、静态库的制作

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 编程之三 静态库的制作和使用的更多相关文章

  1. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  2. iOS开发之静态库的制作

    当你需要和别人分享代码,但又不想让别人看到你内部的实现时就需要制作静态库,通常用于第三方SDK 下面就分享一下制作静态库(.a)的过程: 1.打开Xcode,新建workspace 2.随便给work ...

  3. Win32编程之静态库编写与使用.动态链接库的编写与使用

    Win32编程之静态库编写与使用.动态链接库的编写与使用 一丶什么是静态库.什么是动态链接库. 静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在 ...

  4. iOS静态库的制作与引用

    [iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...

  5. iOS 静态库的制作

    按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程. 在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下. 一.静态库和动态库的详细介绍. 我们平时的工程中或多或少都要引入第 ...

  6. Yuchuan_Linux_C 编程之四动态库(共享库)制作

    一.整体大纲 二.共享库的制作 1. 命名规则: lib + 名字 + .so 2. 制作步骤: 1) 生成与位置无关的代码 (生成与位置无关的.o)    2) 将.o打包成共享库(动态库) 3. ...

  7. C 高级编程3 静态库与动态库

    http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...

  8. iOS实用技能扩展-静态库的制作与简单使用

    前言:此文是关于静态库的概念描述,如何制作及简单调试使用,不同版本的说明与场景使用. 1.关于库的简介: 库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetw ...

  9. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件能够指定父对象 QTimer *timer = QTime ...

随机推荐

  1. linux的进程和管道符(二)

    回顾:进程管理:kill killall pkill问题:1.pkill -u root 禁止2.用户名不要用数字开头或者纯数字windows的用户名不要用中文3.pokit/etc/passwd 6 ...

  2. CF-595

    题目传送门 A .Yet Another Dividing into Teams sol:原先是用比较复杂的方法来解的,后来学弟看了一眼,发现不是1就是2,当出现两个人水平相差为1就分成两组,1组全是 ...

  3. OpenCV 亚像素级的角点检测

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  4. asp.net mvcview界面does not contain a definition

    在cshtml使用linq操作数据集,自动补全是可以使用Select,但是一直提示System.Collection.GenericList' does not contain a definitio ...

  5. JVM组成与作用

    class loader 类加载器:加载类文件到内存.Class loader只管加载,只要符合文件结构就加载,至于能否运行,它不负责,那是有Exectution Engine 负责的.exectio ...

  6. 吴裕雄--天生自然python学习笔记:Python3 网络编程

    Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络 ...

  7. 链终止法|边合成边测序|Bowtie|TopHat|Cufflinks|RPKM|FASTX-Toolkit|fastaQC|基因芯片|桥式扩增|

    生物信息学 Sanger采用链终止法进行测序 带有荧光基团的ddXTP+其他四种普通的脱氧核苷酸放入同一个培养皿中,例如带有荧光基团的ddATP+普通的脱氧核苷酸A.T.C.G放入同一个培养皿,以此类 ...

  8. mysql获取按日期排序获取最新的记录

    今天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况 这种需求,我想很多人都遇到过.下面是我模拟我的内容表 我现在需要取出每个分类中最新的内容 select * from ...

  9. JSP9个内置对象和3个常用指令

    一.9个内置对象: 1.request对象客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.2.response对象包含了响应客户请求的有关信息,但在JSP中很少 ...

  10. 由生到死10个月!做App中的“二”有多难

    十月,原本是怀胎过程的喜悦时光,但这段个时光,如今却是绝大多数App从生到死的所有时间.在App市场表面形式一片大好,彻底主宰我们生活.工作.娱乐的当下,绝大多数用户只是在App海洋中只取一瓢饮,其他 ...