LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 820|回复: 4

小声的问一个问题,关于“头文件”的。

[复制链接]
发表于 2006-1-14 21:42:45 | 显示全部楼层 |阅读模式
在/usr/include下,都是头文件。
定义了一些#define和一些“函数”(这些函数好象只是声明而已),
如果我#inclue了这些头文件,
使用了里面的声明了的函数,
计算机是怎么找到这个函数的具体实现的细节的呢?

假如我写了一个头文件,
将他cp到了/usr/include下,
编译一个#include这个头文件的程序(gcc foo.c),
计算机会到哪里找到实现头文件里的那些函数所在的“.c”文件呢?
发表于 2006-1-14 22:15:13 | 显示全部楼层
#include “xxx.h”
楼主学习下c的初级知识
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-14 22:53:24 | 显示全部楼层
Post by dancingpig
#include “xxx.h”
楼主学习下c的初级知识


当然,小弟才开始解除这个东西,
还需要个位前辈的赐教。
不过,难道是我的问题描述的有问题?
使您产生了误解?

我想知道的是这个xxx.h中声明的函数细节,
编译器是怎么找到的。

比如:
xxx.h文件内容是:

  1. int abc(int, int);
复制代码


yyy.c的内容是:

  1. #include <xxx.h>
  2. int abc(int x, int y)
  3. {
  4.       return x + y;      
  5. }
复制代码


zzz.c的内容是:

  1. #include <xxx.h>

  2. main()
  3. {
  4.        printf("Result = %d", abc(3,4) );
  5. }
复制代码


如果我 gcc zzz.c,
那么编译器是怎么找到yyy.c中的abc的实现细节呢?
回复 支持 反对

使用道具 举报

发表于 2006-1-14 23:10:53 | 显示全部楼层
楼主可以试一试这样编译你的程序。
首先你引用当前目录下的头文件应该用双引号""。即使这样直接gcc zzz.c会得到"undefined reference to abc()"错误。
你这个程序编译应通过以下步骤:
$ gcc -c yyy.c
$ gcc -c zzz.c
$ gcc -o zzz zzz.o yyy.o

你问的关于系统调用的问题,是因为在你编译的时候,链接程序会自动帮你链接到c程序库libc。
如果你所调用的库不是默认链接的库,就需要人工指定。比如,你使用math.h头文件内定义的函数,就要在编译的时候指定(假定文件名为test.c):
$ gcc test.c -lm
你可以在/usr/lib下面找到libm.a,这就是math.h头文件所定义的内容的静态库,你的程序通过头文件引用静态库里的内容并链接成最终的可执行文件。

大体的过程是这样,具体过程或者文件名称可能有错误。我知道了会修改。楼主应该多了解一些编译方面的知识。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-15 09:46:27 | 显示全部楼层

十分感谢!

多谢manphiz兄的指点,
小弟受教了。

看来要想实现我的想法(将自己的头文件[xxx.h]放到/usr/include中),
在自己的程序中使用#include <xxx.h>,
也要将相应的“.c”弄成链接库、放到/usr/lib下了(当然其他的地方也可以)。

记得以前在windows用Trubo C时,
好象是CTRL+F9、或是ALT+F9就把程序编译并链接了,
当时只注意C语言本身了,而没太在意编译是怎么实现的。

在linux下学习C的编成,
看来我还需要提高很多东西。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表