Makefile相关

Makefile真是博大精深。。。

子目录Make

一个项目的目录结构如此:

├── liba
│   ├── A.c
│   ├── A.h
│   ├── Makefile
│   └── test.c
├── libb
│   ├── B.c
│   ├── B.h
│   ├── Makefile
│   └── test.c
├── main.c
└── Makefile

liba和libb都是独立的模块,有着自己的.h文件,.c文件和测试文件。在这两个目录下分别make,会生成相应的.o文件(liba/A.o, libb/b.o)和测试用的可执行文件。上层目录中的main.c是我们的程序主入口,分别include了这两个模块。
我希望分别在liba和libb下分别make生成.o文件,再回到main.c目录进行make操作。为了达到这一效果,可以采用这里所描述的方法。

CODE_DIR_A = liba
CODE_DIR_B = libb

... ...

.PHONY: a_code b_code clean
a_code:
    $(MAKE) -C $(CODE_DIR_A)
b_code:
    $(MAKE) -C $(CODE_DIR_A)
clean:
    $(MAKE) -C $(CODE_DIR_A) clean
    $(MAKE) -C $(CODE_DIR_B) clean
是的,你提到的这个问题 —— **`validateUbootWithRecover` 函数没有 `#include` 却能编译通过**,**确实可能和 Makefile 有关**,但不是直接导致“不需要声明”的原因。下面我们来详细解释它和 Makefile 的关系。 --- ### ✅ 一、Makefile 和 编译行为的关系 Makefile 决定的是: - 哪些 `.c` 文件会被编译; - 使用哪些编译选项(比如 `-Wall`、`-Werror`); - 是否启用某些宏定义(如 `CONFIG_XXX`); - 最终链接哪些目标文件生成可执行文件。 所以,Makefile **不会决定你是否必须写 `#include`**,但它会影响你是否能发现“没写声明”的问题。 --- ### ✅ 二、为什么“没写 include”还能编译? 如你前面的问题所说,这是 C 语言的特性 —— **隐式函数声明(implicit declaration)**,它允许你调用一个未声明的函数,前提是返回值是 `int`。 Makefile 的作用体现在: #### 1. **是否启用警告选项** 如果 Makefile 中没有启用 `-Wall` 或 `-Werror=implicit-function-declaration`,那么编译器就不会报错或警告。 例如: ```makefile CFLAGS += -Wall -Werror ``` 有了这个选项,编译时就会报错: ``` error: implicit declaration of function 'validateUbootWithRecover' ``` #### 2. **是否启用特定宏定义** 你看到的代码中: ```c #ifdef KER_ROM_SEPARATED ret = validateUbootWithRecover(); if (!ret) { miniosFlag = 0; } else { miniosFlag = 1; } #endif ``` 这段代码只有在 Makefile 中定义了 `KER_ROM_SEPARATED` 宏时才会被编译进去。也就是说: - 如果 Makefile 中没有定义 `KER_ROM_SEPARATED`,这段代码不会被编译,自然也不会报错。 - 如果定义了,但没有声明函数,就可能产生警告或错误 —— **这取决于 Makefile 中的编译器选项。** --- ### ✅ 三、Makefile 对代码规范的影响 | Makefile 设置 | 对代码规范的影响 | |---------------|------------------| | 没有 `-Wall` | 不会提示“隐式声明”问题 | | 有 `-Werror` | 把警告当作错误,强制开发者修复 | | 定义了 `KER_ROM_SEPARATED` | 会编译调用 `validateUbootWithRecover()` 的代码 | | 没有定义该宏 | 该函数调用不会被编译,不会出错 | --- ### ✅ 四、总结一句话: > 虽然 `validateUbootWithRecover` 没有 `#include` 是 C 语言允许的行为,但 Makefile 的编译选项和宏定义会影响你是否能发现这个问题。 > > **Makefile 决定了你是否“看到”这个错误,而不是“是否允许”这个错误存在。** --- ### ✅ 建议做法: 1. 在 Makefile 中加上: ```makefile CFLAGS += -Wall -Werror ``` 2. 在调用函数前加上: ```c #include "validateUbootWithRecover.h" ``` 这样可以提升代码质量,避免潜在的运行时错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值