上一篇文章已经讲过了程序从源文件到可执行文件之间的实现过程,这篇文章讲一个简单的例子,首先准备三个文件。


//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文件已经生成,可以执行。