MakeFile罢工了?

本文探讨了使用MakeFile时常见的错误之一:未能正确加载所需的头文件。具体介绍了如何在MakeFile中指定正确的头文件路径,以确保编译过程能够顺利进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

MakeFile:couldn't open ?

刺猬@http://blog.csdn.net/littlehedgehog

 

手用MakeFile时常都会有这样那样的问题。要么少包含了文件,要么忘了写上编译的附加信息。其实这些makefile用多了之后就习惯了这里介绍一个采用MakeFile时很容易出错的问题,顺便透露个用makefile不是技巧的技巧。

在《自己动手写操作系统》附代码中(/Tinix/chapter5/h/boot),有个MakeFile,书上都讲得好好的,但就是运行这个makefile死活不通过。提示信息如下:

fatal: unable to open include file `load.inc'

一般遇到这类问题,可以往上面看看 MakeFile 究竟运行的是什么命令:

nasm  -o  boot.bin  boot.asm

看看MakeFile运行的这个命令,很明显的是我们没有包含 boot.asm 所需要的其它文件头,我们如果要编译boot.asm 正确的命令应该是 nasm -I ./include/ -o boot.bin boot.asm      这里要注意这个包含的文件头 -I ./include/    本来在 include 后面于渊的书上没有写 ' / ' ,但我没写就死活运行不了。最后还是把-I ./include  改成了 -I ./include/   注意后面我加了一个 /

由于这条MakeFile的命令是 $(ASM) $(ASMFLAGS) -o $@ $<   那么我们在ASMFLAGS 加上 有关 include 的信息即可了:

ASMFLAGS = -I ./include/

 

 

自己动手写操作系统》读书笔记系列

### Makefile 中特殊变量 `$?` 的含义与用法 在 `Makefile` 中,特殊变量 `$?` 表示所有比目标更新的依赖项列表,这些依赖项是以空格分隔的文件名集合[^4]。此变量通常用于仅重新编译那些由于其依赖项发生变化而需要更新的目标。 #### 使用场景举例 假设有一个简单的 `Makefile` 文件如下: ```makefile target: source1.c source2.h gcc -o target $? -I. ``` 在这个例子中,如果 `source1.c` 或者 `source2.h` 被修改过,则 `$?` 将返回被修改过的文件名称作为参数传递给命令行。如果没有文件发生更改,则不会执行任何操作[^5]。 需要注意的是,在某些情况下可能更倾向于使用其他类似的自动变量如 `$<` (只取第一个前置条件),或者全面性的 `$^`(列出所有的前置条件而不考虑重复)[^6]。 因此,当希望基于特定条件下运行构建过程时(即只有当某个源码或头文件确实发生了变化才触发动作),可以利用这个特性来优化大型项目的增量构建效率。 ```makefile # 示例代码片段展示如何应用$? objects = main.o utils.o program : $(objects) @gcc -o program $? main.o : main.c defs.h utils.o : utils.c externs.h ``` 在此脚本里,假如只是改变了 `defs.h` 并未改动其余部分的话,那么最终链接阶段只会包含真正受到影响的对象模块——也就是由最新版本的 `.h` 文件所影响到的那个对象文件[^7]。 ### 总结 综上所述,通过合理运用 `$?` 变量可以帮助开发者实现更加高效灵活的软件开发流程管理机制;同时也要注意结合实际情况选取最合适的解决方案以满足项目需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值