本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Whats the difference between a header file and a library?
谁能告诉我头文件和库文件的实际含义是什么?
例如,我们在程序中包括带有.h扩展名的头文件及其定义,但实际实现是在库文件中定义的,这是在链接阶段完成的,这就是人们所说的,但有时我们也为 例如,在posix线程中生成exec文件的程序的人说在命令行中包含-lpthread,但是为什么当我们包含头文件#include <>时为什么还要仍然包含库文件,我可能也知道原因 ??
请先询问再搜索。 这已经覆盖了十亿次。
我写过有关头文件的文章,如果您认为可以以任何方式帮助您,请访问rajkishor09.hubpages.com/_viki/hub/
通常,头文件将某些内容(主要是它们的存在或声明)通知编译器,以便编译器可以正确地构建单个转换单元(例如单个C文件)。
库文件是执行该头文件中指定的工作的实际可执行代码。链接器将其链接起来以提供实际功能(_definitions,而不仅仅是声明)。
因此,在您的示例中,您可能需要执行以下操作:
#include
它告诉编译器所有关于pthread_mutex_this,pthread_condvar_that和pthread_thread_the_other东西的存在,但实际上并未提供这些东西的实现。
-lpthread选项告诉链接器,它应基于pthread名称定位一个库,以便从库中提取实际的实现,以便放弃最终的可执行文件。
类似地,虽然stdio.h保留有关I / O内容的信息,但它的实际代码将在运行时库中(尽管您很少需要专门链接该库,因为编译器会尽力为您处理)。因为您通常与编译器链接(即,编译器为您调用链接器),所以它知道您可能需要C运行时库。如果要直接使用链接器(例如使用ld命令),则可能不会发生,并且必须明确。
谢谢paxdiablo,但有一个小问题,为什么在使用posix线程时在命令行中包含-lpthread,但为什么不为其他标头文件(如stdio.h math.h)提供帮助,为什么我们不说-lmath或-lstdio呢?
实际上,@ karthik有时确实必须指定-lmath(对于那些将其与C RTL分开的环境)。但是我的答案的最后一段解释了为什么您通常不必这样做的原因-对此我会做一些扩展。
@karthik大多数标准C和posix函数在标准C库中,默认情况下会链接到其中,而其他函数(例如pthread函数或某些数学函数)则驻留在必须显式链接的其他库中。
标头文件:这些文件包含在任何程序的顶部。如果我们在程序中使用任何函数,则必须包含包含该函数的声明或定义的头文件。就像在stdio.h中定义了printf()一样,因此必须将其包括(通过#include来使用printf()。
库文件:这些是编译器用来定义已在程序中使用并已在头文件中声明的功能的文件。例如,printf()具有完整的定义,例如其工作方式等。在一个I / O库中!因此,编译器使用该库来获取用于printf的机器代码。
区别:
头文件是TEXT文件,而库文件是BINARY。
这意味着,我们可以读取和修改头文件,但不能读取和修改库!
头文件是C语言的,而库是机器语言的!
程序员必须包含头文件,而编译器会自动将库文件与程序相关联!
我喜欢您的解释pankaj,您确实提供了清晰的视图,但是您是否知道我如何创建自己的库,一个库文件有什么扩展名示例,我有一个头文件stringi.h,并且我在文件中写了这些函数定义,然后我希望该文件成为库文件,以便以后可以使用,但是我如何使该文件作为库文件供将来使用
@karthik adp-gmbh.ch/cpp/gcc/create_lib.html,请遵循此步骤。
头文件仅包含将在包含头文件的文件中使用的功能的定义。
库文件构成了将在程序中使用的功能的实际实现。
头文件在预处理阶段包含(复制/粘贴),并且在编译阶段作为正在编写的程序的一部分进行编译。必须在命令行中指定-lpthread,以便链接器知道要在程序中使用的功能的库。
关于Stackoverflow的类似问题/答案以通俗易懂的方式进行解释:
头文件和库之间有什么区别?
第2部分:为什么在拥有#include时不必总是包含库文件?
在以下情况下可能会是这种情况:
i. The implementation of the
functions is included in the header
file.
ii. The implementation of the
functions is in c files for which
you have the source available.
iii. The required libraries are
included by your compiler by default
e.g., standard c libraries.
注意:这是对标准C库中包含的内容的引用,许多编译器默认都包含此标准C库。
谢谢ozair,但是为什么我们只在命令行中将其用于线程,为什么不将其用于其他头文件呢?
@karthik:gcc自动为标准C库添加-l标志。这意味着在stdio.h,stdlib.h等中声明的函数。
但是我们声明pthread.h不是标准的c库吗?为什么编译器不自动为pthread添加,为什么只为stdio.h和stdlib.h添加
@Karthik:根据您的评论,我现在在回答中添加了详细信息。
@Karthik:我现在也引用了标准C库中的内容。尤其是它不包含pthreads。
@karthik:如果您仍然不 gcc并不真正了解标头和库之间的关系。它只是用基本的东西对一些-l标志进行了硬编码。
@karthik:很好,所以现在您将接受最佳答案。