【问题标题】:What are Header Files and Library Files? [duplicate]什么是头文件和库文件? [复制]
【发布时间】:2011-09-18 11:24:40
【问题描述】:

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

谁能告诉我头文件和库文件的实际含义以及它们的区别?

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

【问题讨论】:

标签: c gcc makefile posix


【解决方案1】:

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

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

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

#include <pthread.h>

它告诉编译器所有关于pthread_mutex_thispthread_condvar_thatpthread_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 函数或一些数学函数)驻留在其他库中明确链接。
【解决方案2】:

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

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

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

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

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

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

在以下情况下可能会出现这种情况:

我。的实施 函数包含在标题中 文件。

二。的实施 函数位于c 文件中 你有可用的来源。

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

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

【讨论】:

  • 谢谢 ozair,但为什么我们在命令行中只将它用于线程,为什么我们不将它用于其他头文件,这是我的问题
  • @karthik:gcc 自动为标准 C 库添加 -l 标志。这意味着在stdio.hstdlib.h 等中声明的函数。
  • 但是我们声明 pthread.h 不是标准 c 库?为什么编译器不自动为 pthread 添加,为什么只为 stdio.h 和 stdlib.h 添加
  • @Karthik:根据您的评论,我现在已经在我的答案中添加了详细信息。
  • @Karthik:我现在还引用了标准 C 库中包含的内容。值得注意的是,它不包括 pthread。
【解决方案3】:

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

Library Files: 这些是编译器用来定义在程序中使用并在头文件中声明的函数的文件.like, printf() 有其完整的定义,比如它在 I/O 库中的工作方式等!因此,编译器使用该库来获取 printf 的机器代码。

区别:

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

【讨论】:

  • 我喜欢你的解释 pankaj 你确实给出了一个清晰的观点但是你知道我如何创建我自己的库 库文件有什么扩展名例如我有一个头文件 stringi.h 我有将这些函数定义写在一个文件中,然后我希望该文件成为一个库文件,以便我以后可以使用,但是如何将文件作为库文件以供将来使用
  • @karthik adp-gmbh.ch/cpp/gcc/create_lib.html 你应该关注这个。
猜你喜欢
  • 2020-08-19
  • 2017-09-06
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多