Linux/Unix [-z “$“]的含义

这篇博客探讨了Linux shell脚本中如何使用`[-z $1]`检查第一个参数是否为空。如果参数为空,脚本将输出错误信息并退出。这个简单的条件语句在确保脚本接收到正确输入时非常有用。
if [-z "$"]; then 
	echo"-----error-----"
	exit
fi

-z 在if里的意思是 “空”
$1 第一个参数
[ -z “$1” ],这是需要返回一个值0或者1
总结来说,就是第一个参数如果是空,则输出“-----error-----”

更多linux 相关的编成语句如果用到的话将会被记录,

respect!

你问的这个问题非常关键: ```makefile CFLAGS += -I$(STORAGE_DIR)/include -I$(INSTALL_PREFIX)/include ``` 中的 `include` 是什么意思? 我们来 **彻底解释清楚** 这个 `include` 的含义、作用和常见用法。 --- ## ✅ 一、`include` 在这里是一个**目录名** 在 C/C++ 项目中,`include` 是一个**约定俗成的标准目录名称**,用于存放项目的**头文件(`.h` 文件)**。 例如: ``` project/ ├── src/ │ ├── main.c │ └── utils.c ├── include/ ← 所有对外公开的 .h 文件放在这里 │ ├── disk_api.h │ └── storage.h └── Makefile ``` 当你写: ```c #include "disk_api.h" ``` 编译器就会去所有 `-I` 指定的路径下找这个文件。 如果 `-I` 包含了 `$(STORAGE_DIR)/include`,那么它会在这个目录里搜索 `disk_api.h`。 --- ## 📁 二、为什么叫 `include`?历史与规范 ### 1. 历史原因 - Unix/Linux 系统中,系统头文件放在 `/usr/include` - 第三方库安装时也默认把头文件放进 `/usr/local/include` - 编译器默认搜索这些路径 所以开发者模仿这种结构,在自己的项目中也创建 `include/` 目录。 ### 2. 构建系统的惯例 无论是 Makefile、CMake、Autotools 还是 Meson,都遵循: | 目录 | 用途 | |------|------| | `src/` | 源代码 `.c`, `.cpp` | | `include/` | 头文件 `.h`, `.hpp` | | `lib/` | 编译后的库文件 `.a`, `.so` | | `bin/` | 可执行文件 | | `build/` | 中间编译产物 | 👉 所以 `include` 就是“专门放头文件”的标准目录名。 --- ## 🔍 三、具体分析你的这行代码 ```makefile CFLAGS += -I$(STORAGE_DIR)/include -I$(INSTALL_PREFIX)/include ``` 我们拆解一下: | 部分 | 含义 | |------|------| | `-I` | GCC 选项:告诉编译器“增加一个头文件搜索路径” | | `$(STORAGE_DIR)/include` | 变量 `STORAGE_DIR` 指向某个路径,再加上 `/include` 子目录 | | `$(INSTALL_PREFIX)/include` | 安装前缀下的 include 目录,比如 `/usr/local/include` | ### 示例展开: 假设: ```makefile STORAGE_DIR = Z:/nvr_2025/u_packages/storage/src INSTALL_PREFIX = /opt/myproject ``` 那么这行就等价于: ```bash -I Z:/nvr_2025/u_packages/storage/src/include -I /opt/myproject/include ``` 也就是说,编译器会在以下两个地方查找头文件: 1. `Z:/nvr_2025/u_packages/storage/src/include/disk_api.h` 2. `/opt/myproject/include/some_other_header.h` --- ## 💡 四、什么时候用哪个? | 路径 | 使用场景 | |------|---------| | `$(STORAGE_DIR)/include` | 开发阶段,从源码目录直接引用头文件(你当前的情况) | | `$(INSTALL_PREFIX)/include` | 发布后,从已安装的库中引用头文件(如 make install 后) | 这是典型的“开发 + 安装”双模式支持。 --- ## ✅ 五、最佳实践建议 ### 1. 统一使用 `include/` 目录存放公共头文件 ``` u_packages/ └── storage/ └── src/ ├── include/ ← 放 disk_api.h │ └── disk_api.h └── src/ └── disk_ops.c ``` ### 2. Makefile 中这样写: ```makefile # 定义路径变量 STORAGE_DIR := ../../../../u_packages/storage/src CFLAGS += -I$(STORAGE_DIR)/include ``` ### 3. 在 C 文件中使用: ```c #include "disk_api.h" // ✅ 正确,因为 -I 已经指向 include 目录 // 不要写 #include "include/disk_api.h" ``` --- ## ❌ 常见错误 | 错误做法 | 问题 | |--------|------| | 把 `.h` 文件放在 `src/` 下不单独建 `include/` | 结构混乱,别人不知道哪些是公开接口 | | 写 `#include "include/disk_api.h"` | 强制要求别人必须把路径加到根,破坏可移植性 | | 忘记 `-I` 导致找不到头文件 | 编译报错 | --- ## ✅ 总结:`include` 是什么? > `include` 是一个**标准命名的目录**,用于存放 C/C++ 项目的**头文件(.h)**,并被 `-I` 参数添加到编译器的搜索路径中。 它的存在是为了: - ✅ 让头文件集中管理 - ✅ 支持模块化开发(A 模块可以包含 B 模块的头文件) - ✅ 兼容系统和工具链的习惯 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel_Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值