我正在尝试编写一个makefile,但我并不真正了解目标文件的工作原理。我的文件夹中没有.o
个文件,那么我该如何编译呢?每个.h
文件都有相应的.o
吗?如果没有,那么我们如何知道是否必须编译目标文件?对不起,如果这些是愚蠢的问题,我是编程新手。
谢谢。
答案 0 :(得分:4)
基本上,头文件(.h)告诉编译器在生成对象(.o)文件时存在的事情。编译器从源(.c / .cpp / etc.)文件生成目标文件。如果编译器没有具体了解某些内容,那么它会认为标题是正确的并且留下了一个" name"落后于链接器。
链接器将通过替换" names"来获取目标文件并生成可执行文件。在目标代码中包含来自其他目标文件的代码。
这是对发生的事情的非常高级概述。关于细节有很多页面。
答案 1 :(得分:0)
一个简单的答案来说明整体概念:
每个.c文件都包含程序代码,编译器将其转换为包含机器代码的.o文件。
通常将不同的.c文件合并到一个软件中。但他们必须 以某种方式连接。因此他们的.o文件必须连接到 可执行文件。这就是链接器的作用。
.h文件描述.c文件的连接点。
链接器使用.c文件连接来生成软件。
然而,这是一种简化:
例如,.h文件不由链接器查询。他们只服务 编译器告诉他某个符号是链接器必须解析的连接点。
.h文件是为了方便软件开发人员。当.c文件具有链接器的“连接点”时,其对等.h文件可以全部列出它们。 如果另一个.c文件想要使用它们,它可能只包含相应的.h文件。但这只是一个惯例。从理论上讲,只有.c文件才是必不可少的。理论上,每个软件项目都只能用.c文件编写(但是,大部分时间都不是在适当的时候)。