Linux下静态库与动态库的使用
2015-11-25 20:24
471 查看
转自:http://blog.csdn.net/htttw/article/details/7269485
Linux下静态库与动态库的使用
Linux下有静态链接库和动态链接库两种,静态链接库的后缀名是.a,动态链接库的后缀名是.so,下面详细介绍:
静态链接库:
静态链接库是指程序在编译链接的过程中就把依赖的库插入到程序中,这样程序的运行就不需要这些库的支持,但缺点是文件变大,下面以一个例子介绍如何制作静态链接库:
有add.c和mul.c两个文件,分别实现两数相加与相乘:
add.c:
[cpp] view
plaincopy
int my_add(int num1, int num2)
{
return num1 + num2;
}
mul.c:
[cpp] view
plaincopy
int my_mul(int num1, int num2)
{
return num1 * num2;
}
还有一个computer.h头文件,声明了上面两个函数:
[cpp] view
plaincopy
int my_add(int num1, int num2);
int my_mul(int num1, int num2);
还有一个main.c文件调用这两个函数:
[cpp] view
plaincopy
#include <stdio.h>
#include "compute.h"
int main()
{
int a=3, b=5;
printf("%d + %d = %d\n", a, b, my_add(a, b));
printf("%d * %d = %d\n", a, b, my_mul(a, b));
return 0;
}
因此,整个例子有4个文件。现在我们把add.c和mul.c编译成静态链接库:
[plain] view
plaincopy
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
上面首先把add.c和mul.c编译成两个独立的.a文件,然后把他们合并成一个静态链接库libcompute.a(当然你也可以把它们做成两个静态链接库,连接main的时候指定这两个就可以了)。static表示编译成静态链接库。ar是一个打包命令。
现在静态链接库libcompute.a做好了,下面我们把它插入到main.c中:
[plain] view
plaincopy
gcc -o main main.c -lcompute -L.
上面的-lcomputer表示要链接的静态链接库是libcomputer.a,-L.表示在当前目录下寻找。
为了方便,我们把上面的命令写在一个Makefile里:
Makefile:
[plain] view
plaincopy
all:
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
首先:make lib 生成静态链接库
然后:make 生成最终的main可执行文件
这样就可以了,运行main,正确输出结果了:
[plain] view
plaincopy
3 + 5 = 8
3 * 5 = 15
前面说过,可以不把add.o和mul.o合成一个静态链接库,下面给出的是这种方法的Makefile:
Makefile:
[plain] view
plaincopy
all:
gcc -o main main.c -ladd -lmul -L.
lib:
gcc -o libadd.a -c add.c -static
gcc -o libmul.a -c mul.c -static
clean:
rm -f *.o *.a main
当然为了简便,我们可以只运行一个命令就搞定所有的事情:
Makefile:
[plain] view
plaincopy
all: lib
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
只要一个make命令就搞定了~~
动态链接库:
完成!
Linux下静态库与动态库的使用
Linux下有静态链接库和动态链接库两种,静态链接库的后缀名是.a,动态链接库的后缀名是.so,下面详细介绍:
静态链接库:
静态链接库是指程序在编译链接的过程中就把依赖的库插入到程序中,这样程序的运行就不需要这些库的支持,但缺点是文件变大,下面以一个例子介绍如何制作静态链接库:
有add.c和mul.c两个文件,分别实现两数相加与相乘:
add.c:
[cpp] view
plaincopy
int my_add(int num1, int num2)
{
return num1 + num2;
}
mul.c:
[cpp] view
plaincopy
int my_mul(int num1, int num2)
{
return num1 * num2;
}
还有一个computer.h头文件,声明了上面两个函数:
[cpp] view
plaincopy
int my_add(int num1, int num2);
int my_mul(int num1, int num2);
还有一个main.c文件调用这两个函数:
[cpp] view
plaincopy
#include <stdio.h>
#include "compute.h"
int main()
{
int a=3, b=5;
printf("%d + %d = %d\n", a, b, my_add(a, b));
printf("%d * %d = %d\n", a, b, my_mul(a, b));
return 0;
}
因此,整个例子有4个文件。现在我们把add.c和mul.c编译成静态链接库:
[plain] view
plaincopy
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
上面首先把add.c和mul.c编译成两个独立的.a文件,然后把他们合并成一个静态链接库libcompute.a(当然你也可以把它们做成两个静态链接库,连接main的时候指定这两个就可以了)。static表示编译成静态链接库。ar是一个打包命令。
现在静态链接库libcompute.a做好了,下面我们把它插入到main.c中:
[plain] view
plaincopy
gcc -o main main.c -lcompute -L.
上面的-lcomputer表示要链接的静态链接库是libcomputer.a,-L.表示在当前目录下寻找。
为了方便,我们把上面的命令写在一个Makefile里:
Makefile:
[plain] view
plaincopy
all:
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
首先:make lib 生成静态链接库
然后:make 生成最终的main可执行文件
这样就可以了,运行main,正确输出结果了:
[plain] view
plaincopy
3 + 5 = 8
3 * 5 = 15
前面说过,可以不把add.o和mul.o合成一个静态链接库,下面给出的是这种方法的Makefile:
Makefile:
[plain] view
plaincopy
all:
gcc -o main main.c -ladd -lmul -L.
lib:
gcc -o libadd.a -c add.c -static
gcc -o libmul.a -c mul.c -static
clean:
rm -f *.o *.a main
当然为了简便,我们可以只运行一个命令就搞定所有的事情:
Makefile:
[plain] view
plaincopy
all: lib
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
只要一个make命令就搞定了~~
动态链接库:
完成!
相关文章推荐
- Linux创建用户、用户组 及 删除
- linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释
- linux学习笔记之用户切换
- linux学习(二)如何学习linux
- Linux学习笔记之Makefile多个c文件的编写
- linux文件权限chmod
- Linux 学习笔记之Makefile单个c文件的编写
- log4j的用法(For Windows/linux/纯java应用/web应用) logback 的用法在evernote里面
- linux程序前后台切换
- CentOS7编译安装Openvswitch 2.3.0 LTS
- linux修改日期时间
- kill process in linux
- linux V4L2驱动中新旧版本下video buffer alloc与mmap的处理区别
- Linux 格式化U盘为ext4格式以及修复分区表方法
- Linux C 正则表达式运用(regex.h)
- linux中用户相关的命令
- linux下MySQL操作历史记录 ~/.mysql_history
- 操作系统——linux系统文件目录机构
- 克隆或复制VMware虚拟机后,Linux系统eth0消失,显示eth1
- linux__查看库中的函数