C 每个.h文件都有相应的对象文件吗?

C 每个.h文件都有相应的对象文件吗?,c,makefile,compilation,object-files,C,Makefile,Compilation,Object Files,我正试图编写一个makefile,但我并不真正理解对象文件是如何工作的。我的文件夹中没有.o文件,因此如何编译它们?每个.h文件都有相应的.o吗?如果没有,那么我们如何知道是否必须编译一个对象文件?抱歉,如果这些问题都是愚蠢的,我是编程新手 谢谢。基本上,header.h文件告诉编译器在生成object.o文件时存在一些东西。编译器从源.c/.cpp/etc.文件生成对象文件。如果编译器不知道某些特定信息,它会假定头是正确的,并为链接器留下一个名称 链接器将获取目标文件,并通过将目标代码中的名称

我正试图编写一个makefile,但我并不真正理解对象文件是如何工作的。我的文件夹中没有.o文件,因此如何编译它们?每个.h文件都有相应的.o吗?如果没有,那么我们如何知道是否必须编译一个对象文件?抱歉,如果这些问题都是愚蠢的,我是编程新手


谢谢。

基本上,header.h文件告诉编译器在生成object.o文件时存在一些东西。编译器从源.c/.cpp/etc.文件生成对象文件。如果编译器不知道某些特定信息,它会假定头是正确的,并为链接器留下一个名称

链接器将获取目标文件,并通过将目标代码中的名称替换为其他目标文件中的代码来生成可执行文件


这是一个非常高层次的概述。关于细节有很多页。

基本上,header.h文件告诉编译器在生成object.o文件时存在一些东西。编译器从源.c/.cpp/etc.文件生成对象文件。如果编译器不知道某些特定信息,它会假定头是正确的,并为链接器留下一个名称

链接器将获取目标文件,并通过将目标代码中的名称替换为其他目标文件中的代码来生成可执行文件


这是一个非常高层次的概述。关于细节有很多页。

一个简单的答案可以说明整个概念:

每个.c文件都包含由编译器翻译成包含机器代码的.o文件的程序代码

通常不同的.c文件组合到一个软件中。但他们必须这样做 不知何故,他们之间是有联系的。因此,它们的.o文件必须连接到 可执行文件。这就是链接器所做的

.h文件描述了.c文件的连接点

链接器使用.c文件连接生成软件

然而,这是一种简化:

例如,链接器不查阅.h文件。他们只是服务 编译器告诉他某个符号是链接器必须解析的连接点

h文件是为了方便软件开发人员使用。当.c文件具有链接器的连接点时,其对等.h文件可能会列出所有连接点。
如果另一个.c文件想要使用它们,它可能只包含相应的.h文件。但这只是一个惯例。理论上,只有.c文件是必需的。理论上,每个软件项目只能使用.c文件编写,但大多数情况下不能在适当的时间编写。

一个简单的答案可以说明整个概念:

每个.c文件都包含由编译器翻译成包含机器代码的.o文件的程序代码

通常不同的.c文件组合到一个软件中。但他们必须这样做 不知何故,他们之间是有联系的。因此,它们的.o文件必须连接到 可执行文件。这就是链接器所做的

.h文件描述了.c文件的连接点

链接器使用.c文件连接生成软件

然而,这是一种简化:

例如,链接器不查阅.h文件。他们只是服务 编译器告诉他某个符号是链接器必须解析的连接点

h文件是为了方便软件开发人员使用。当.c文件具有链接器的连接点时,其对等.h文件可能会列出所有连接点。
如果另一个.c文件想要使用它们,它可能只包含相应的.h文件。但这只是一个惯例。理论上,只有.c文件是必需的。理论上,每个软件项目都只能使用.c文件编写,但大多数情况下都不能及时编写。

如果只是声明结构而不是函数,则不需要.o文件。编译器会将每个.c文件编译成.o文件。.h文件是否存在以及它们的作用取决于程序员。它们只是依赖项,它们不创建自己的对象文件。您可以将函数与调用方放在同一个.c文件中,同时仍然有一个单独的.h文件用于声明,但这样做是不正当的。我明白了。假设我试图通过一个makefile编译一个程序,该程序依赖于2.c文件,这两个文件都没有依赖的.h文件。当我编译.o文件时,我只需要把相应的.c文件写下来作为它们所依赖的文件,对吗?@gooddeds啊,这就解释了为什么有时候这个人不会回复。非常感谢你!如果只是声明结构而不是函数,则不需要.o文件。编译器会将每个.c文件编译成.o文件。.h文件是否存在以及它们的作用取决于程序员。它们只是依赖项,不创建自己的对象文件
我将为声明创建一个单独的.h文件,但这样做是不正当的。我明白了。假设我试图通过一个makefile编译一个程序,该程序依赖于2.c文件,这两个文件都没有依赖的.h文件。当我编译.o文件时,我只需要把相应的.c文件写下来作为它们所依赖的文件,对吗?@gooddeds啊,这就解释了为什么有时候这个人不会回复。非常感谢你!