先说说库文件是怎么来的吧。
以C为例,我们写一个程序,一般都不会把所有的函数都写在一个文件里面,通常都是划分模块,然后一个模块若干个文件,然后在main文件里面调用这些模块。我这里用一个magic.c文件代替实际程序中的所有的文件,你就当这个magic.c文件非常神奇,你调用里面的magic()函数后,它会自动按你的想法把剩下的工作都完成。下面是两个文件:
mian.c
[cpp]
int main(){ magic(); } magic.c:
[cpp]
#include <stdio.h> void magic(){ printf("This is a magic function\n"); } main.c文件里面没有包括任何头文件,因为我们的编译是手动按步骤的,实际编码不推荐这样做,这里可以更加清楚的知道头文件的作用。一般从C源文件到可执行代码要经过以下4个步骤:预编译(preprocess gcc -E,生成.i文件),编译(compile gcc -S,生成.s文件),汇编(assemble gcc -c,生成.o文件),链接(link 生成可执行文件)。这里只讨论最后两个步骤,汇编和链接。
汇编后的结果是每个源文件都有了对应的二进制代码;链接是把所有的二进制代码打包成一个文件,最后得到可执行文件。
使用这个命令汇编main.c:gcc -Wall -c main.c
-Wall 是列出警告的开关,如果没有这个开关,汇编成功,什么提示都没有,如果打开这个开关,会得到如下一个警告:
main.c:2:3: warning: implicit declaration of function ‘magic’ [-Wimplicit-function-declaration]
要消除这个警告很容易,有两个办法:
1)前面加个声明就好了,void magic();
2)写个magic.h的头文件:
[cpp]
void magic(); 然后在main.c里面包含进来:#include "magic.h"。这两种办法的作用是告诉main,现在没有magic的实现不要紧,我确定一定以及肯定这个magic函数是存在的,放心使用就好了,而且告诉了main这个magic该怎么用,参数是什么,返回值是什么。
但是没有magic的声明也没有问题,只是警告,不是错误,因为我们知道我们的magic是怎么定义的,而且我们也确定会在后面链接magic函数。
但是问题就出在这里了,比如我们写了一个超级牛逼的函数想让别人使用,但是这个超级牛逼的函数要下个礼拜才能给别人怎么办呢?我们可以先给个头文件,然后拍着胸脯说你就按照我这个函数声明写,只要你的调用(call)没问题,程序运行的结果就没问题。