轻松学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.c


1 #include "Test.h"23 int get_result(int firstNum,int secondNum)4 {5     return firstNum secondNum;6 }
main.c


#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接口,用户可以直接进行调用,但是不能看到函数内部是怎么实现的。