上一篇文章已经讲过了程序从源文件到可执行文件之间的实现过程,这篇文章讲一个简单的例子,首先准备三个文件。
//main.c文件内容
#include<stdio.h>
#include "fun.h"
int main()
{
printf("the answer is %d\n",calc(5,6));
printf("hello,world.\n");
return 0;
}
//fun.h文件内容
#ifndef FUN_H
#define FUN_H
int calc(int a,int b);
#endif
//fun.c文件内容
#include"fun.h"
int calc(int a,int b)
{
return a+b;
}
在main.c文件中包含了fun.h文件,并调用了fun.h中定义的calc函数,calc函数的实现在calc.c文件中。
1.预处理、编译、汇编main.c文件
上篇文章已经讲过了如何一步步得到*.i、*.s、*.o文件,这次我们不再一步步生成目标文件(*.o),直接一步到位。
gcc -c main.c -o main.o
此时main.o文件是不能生成可执行文件的。
编译器提示undefined reference to `calc’,因为我们没有链接库文件。
2.创建静态库文件
1.首先,编译fun.c得到fun.o目标文件
gcc -c fun.c
2.然后,创建静态库文件
ar crv libfun.a fun.o
3.在某些系统中,还要为静态库生成一个内容表
ranlib libfun.a
4.库文件创建完成后,就可以链接了。
3.程序链接静态库文件
前面已经生成了main.o文和libfun.a文件,现在我们链接一下,生成可执行文件。
gcc main.o -o main.out -L. -l fun
注意一下这条语句的规则,-L表示指定库文件目录,”.”表示当前文件夹,这里也可以写出目录完整路径。-l fun表示指定库文件名,库文件的完整名是libfun.a,前面的lib和后缀.a均省略。
可见,main.out文件已经生成,可以执行。