什么是头文件和库文件?

时间:2011-06-20 07:20:05

标签: c gcc makefile posix

  

可能重复:
  What's the difference between a header file and a library?

任何人都可以告诉我头文件和库文件的实际含义及其区别是什么?

例如我们在程序中包含扩展名为.h的头文件,它只是定义,但实际的实现是在库文件中定义的,这是在链接阶段完成的,这是人们所说的,但有时我们包含库文件目录对于程序生成exec文件也是如此,例如在posix线程中,人们说要在命令行中包含-lpthread,但为什么当我们包含头文件时#include<>为什么我们仍然需要包含库文件我可能知道原因吗??

3 个答案:

答案 0 :(得分:11)

通常,头文件会通知编译器某些事物(主要是它们的存在或声明),以便编译器可以正确构建单个转换单元(例如单个C文件)。

库文件是实际的可执行代码,它执行该头文件中指定的工作。这由链接器链接以提供实际功能(_definitions而不仅仅是声明)。

因此,在您的示例中,您可能有以下行:

#include <pthread.h>

告诉编译器所有关于pthread_mutex_thispthread_condvar_thatpthread_thread_the_other内容的存在,但实际上并未提供这些内容的实现。

-lpthread选项告诉链接器它应该根据pthread名称找到一个库,它可以从中获取实际的实现,以便最终的可执行文件。

类似地,虽然stdio.h包含有关I / O内容的信息,但它的实际代码将在运行时库中(尽管您很少需要专门链接该库,因为编译器将尝试处理它适合你)。因为您通常与编译器链接(即,编译器为您调用链接器),所以它知道您可能需要C运行时库。如果您直接使用链接器(例如使用ld命令),那可能不会发生,并且您必须是明确的。

答案 1 :(得分:7)

Header Files 这些是包含在任何程序顶部的文件。如果我们在程序中使用任何函数,那么必须包含包含该函数的声明或定义的头文件。在stdio.h中定义了printf()。我们必须包含它(通过#include以便使用printf()。

Library Files 这些是编译器用来定义已在程序中使用并已在header file.Like,printf()有一个完整的定义,比如它在I / O库中的工作方式等等!因此,编译器使用该库来获取printf的机器代码。

<强> 差异:

  1. 头文件是TEXT文件,而库文件是BINARY。 这意味着,我们可以读取和修改头文件而不是库!
  2. 头文件是C语言,而库是机器语言!
  3. 程序员必须包含头文件,而编译器会自动将库文件与程序相关联!

答案 2 :(得分:3)

头文件仅包含您将在包含的头文件的文件中使用的函数的定义。

库文件包含您将在程序中使用的函数的实际实现。

在预处理阶段包含(复制/粘贴)头文件,并将其编译为编译阶段正在编写的程序的一部分。必须在命令行中指定-lpthread,以便链接器知道要查找程序中使用的函数的

Stackoverflow上的类似问题/答案用外行术语解释:

What's the difference between a header file and a library?

第2部分:当我们#include时,为什么我们不必总是包含库文件?

在以下情况下可能就是这种情况:

  

我。执行   函数包含在标题中   文件。

     

II。执行   函数在c个文件中   你有可用的来源。

     

III。所需的库是   included by your compiler by default   例如,标准c库。

注意:这是对what is included in the standard C library的引用,默认情况下包含在许多编译器中。