轻松学C语言 昨天
最近看到一个模块的程序,在阅读的时候发现一个函数有引用,有声明,却找不到在哪里定义,模块只有头文件没有对应的.c文件,顿生疑惑,想着这程序怎么能运行呢。后来发现文件夹中有个后缀为.a的文件,在网上查得原来这是将函数封装成了一个静态库,这样既能实现功能,也对文件的内容起到了保护作用。.a文件是静态链接库文件,一般会和一个头文件配合提供给用户使用,它是一个或多个对象文件(.o)的组合。下面就以一个例子来说明怎么生成.a文件。
1. 创建三个文件Test.c , Test.h,main.c
内容分别如下:
Test.h
1 #ifndef _TEST_H_2 #define _TEST_H_3 4 int get_result(int firstNum,int secondNum);5 6 #endif //test.h
Test.cmain.c1 #include "Test.h"
2
3 int get_result(int firstNum,int secondNum)
4 {
5 return firstNum secondNum;
6 }
#include
#include "Test.h"
int main()
{
int rlt;
rlt = get_result(23,7);
printf("The result is: rlt = %d\n",rlt);
return 0;
}
其中Test.h,Test.c用于生成静态库,main.c用于测试。
2. 编译对象(.o)文件
使用: gcc -c Test.c, 确认是否生成.o文件。
3. 生成静态库
在linux环境下输入ar cr libmyTest.a Test.o, 查看当前目录下是否生成了库文件libmyTest.a文件,其中ar为linux环境下的创建、修改库文件的指令, cr为该指令的选项命令.
4. 测试
输入gcc -o main main.c libmyTest.a, 查看是否生成了main的可执行文件,然后再输入./main即可得到运行结果。 不需要在使用Test.c这个源文件进行编译操作, 直接操作.a库文件即可, 而且得到了.a库文件之后,即使没有了对应的.c源文件也可以编译运行。
所以模块厂商提供的程序的时候会只提供头文件和库文件,头文件用来说明API接口,用户可以直接进行调用,但是不能看到函数内部是怎么实现的。