您的位置:首页 > 运维架构 > Linux

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.cmul.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命令就搞定了~~

动态链接库:

完成!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: