可能重复:
What's the difference between a header file and a library?
任何人都可以告诉我头文件和库文件的实际含义及其区别是什么?
例如我们在程序中包含扩展名为.h的头文件,它只是定义,但实际的实现是在库文件中定义的,这是在链接阶段完成的,这是人们所说的,但有时我们包含库文件目录对于程序生成exec文件也是如此,例如在posix线程中,人们说要在命令行中包含-lpthread,但为什么当我们包含头文件时#include<>为什么我们仍然需要包含库文件我可能知道原因吗??
答案 0 :(得分:11)
通常,头文件会通知编译器某些事物(主要是它们的存在或声明),以便编译器可以正确构建单个转换单元(例如单个C文件)。
库文件是实际的可执行代码,它执行该头文件中指定的工作。这由链接器链接以提供实际功能(_definitions而不仅仅是声明)。
因此,在您的示例中,您可能有以下行:
#include <pthread.h>
告诉编译器所有关于pthread_mutex_this
,pthread_condvar_that
和pthread_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的机器代码。
<强> 差异: 强>
答案 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的引用,默认情况下包含在许多编译器中。