/*********************************************************************
* Author : Samson
* Date : 06/30/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
* *******************************************************************/
在传统的静态程序库中,生成的代码通常封装在一个程序库文件中(其名称以 .a 结尾),
linux下静态库的建立与使用,一般都是采用ar命令进行制作,ar crv 生成的静态库名 生成的可执行程序1 生成的可执行程序2……下面就编写一个简单的示例程序,来更清楚的了解一下制作一个静态链接库的过程。
先定义一个头文件test1.h,内容如下:
#include <stdlib.h>
#include <stdio.h>
void test1();
void test2();
再分别建立两个C文件,一个为test1ForStaticDll.c,内容如下:
#include "test1.h"
void test1()
{
printf("this is test1\n");
}
一个为test2ForStaticDll.c, 内容如下:
#include "test1.h"
void test2()
{
printf("this is test2\n");
}
分别生成这两个C文件的目标文件,命令行如下:
gcc -c test1ForStaticDll.c -o lib_test1.o
gcc -c test2ForStaticDll.c -o lib_test2.o
使用nm命令分别查看编译生成的两个目标程序,如下:
[root@UFO dlltest]# nm lib_test1.o
U puts
00000000 T test1
[root@UFO dlltest]# nm lib_test2.o
U puts
00000000 T test2
然后使用ar把这两个目标程序打包成一个静态链接库文件,如下:
ar crv libtest.a lib_test1.o lib_test2.o
命令行中的crv参数分别表示:
c:创建一个静态链接库
r:表示把目标插入到静态链接库文件中
v:打印出创建过程中的相关信息
再使用nm命令查看打包后的静态链接库文件中包含的函数符号信息,如下:
[root@UFO dlltest]# nm libtest.a
lib_test1.o:
U puts
00000000 T test1
lib_test2.o:
U puts
00000000 T test2
以上是生成一个静态库的全过程,下面我们再编写一个测试文件testDll.c文件,内容如下:
#include "test1.h"
int main()
{
test1();
test2();
printf("this is main\n");
return 0;
}
编译测试文件testDll.c,编译命令行为:
gcc -o testdll.out testDll.c libtest.a
然后执行生成的可执行程序testdll.out, 执行结果如下:
[root@UFO dlltest]# ./testdll.out
this is test1
this is test2
this is main