关于Linux下的库文件

先说说库文件是怎么来的吧。

以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)没问题,程序运行的结果就没问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzwxx.html