/ ./ ../相对路径详细解释

博客介绍了相对路径中 /、./、../ 的含义,/ 代表根目录,./ 代表当前目录,../ 代表当前目录的上一级目录。并以 Java 标准目录为例,说明了以 my.txt 为基准,访问不同目录下图片的相对路径写法。

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

相对路径:由于是相对的,所以必须有一个基准作为参照物来说明

/ 基准所在的最顶级目录即根目录,根目录是相对于其他子目录来说的

./ 基准所在的当前目录

../ 基准所在的当前目录的上一级目录(当前目录的父级目录)

下面以一个java的标准目录来具体说明

1、基准my.txt访问当前目录(./)logimg文件夹中的图片c.png

src = ./img/c.png 或者 src = img/c.png ,img默认是当前目录下的img文件夹,./代表基准的当前目录log

2、基准my.txt访问上一级目录(../)testimg文件夹中的图片b.png

src = ../test/img/b.png

3、基准my.txt访问根目录(/)demoimg文件夹中的图片a.png

src = /demo/img/a.png 或者 src = ../../demo/img/a.png

<think>好的,用户现在问的是关于如何正确修改Makefile中的路径配置的问题。之前我已经给出过两种方法,一种是使用GLOBAL_INCLUDES,另一种是直接使用相对路径包含头文件。现在用户提供了一段修改后的Makefile代码,询问是否可以将原来的GLOBAL_INCLUDES的写法改成他们提供的版本。 首先,我需要仔细看一下用户的改写是否正确。用户提供的改写是: LOCAL_DIR := $(GET_LOCAL_DIR) INCLUDES += -I$(LOCAL_DIR)/../../../lk2/lib/kcmdline/include 而原来的建议是: GLOBAL_INCLUDES += $(LOCAL_DIR)/../../../../../lk2/lib/kcmdline/include 用户可能对Makefile中的变量不太熟悉,或者想换一种方式来设置包含路径。我需要确认这两个变量的区别,以及路径是否正确。 首先,GLOBAL_INCLUDES和INCLUDES可能在不同的构建系统中用法不同。比如,在LK(Little Kernel)的构建系统中,GLOBAL_INCLUDES通常会被自动转换为编译器的-I参数,而直接使用INCLUDES可能也是可行的,但需要知道具体的构建系统如何处理这些变量。 其次,用户修改后的路径层数减少了,原来的路径是../../../../../lk2,而现在是../../../lk2。这可能是因为用户重新定义了LOCAL_DIR,导致路径层级变化。例如,如果GET_LOCAL_DIR返回的是当前Makefile所在的目录,比如oplus_system_debug目录,那么原来的LOCAL_DIR可能已经是这个目录,而用户改写后的LOCAL_DIR可能被重新定义,导致需要不同的回退层数。 接下来需要检查路径是否正确。假设原路径是从lk/platform/common/oplus_system_debug到lk2/lib/kcmdline/include,那么可能需要回退多级目录到项目根目录,再进入lk2。如果用户改写后的路径层数减少,可能是因为LOCAL_DIR被设置为不同的起点,或者构建系统的路径处理方式不同。 另外,用户是否正确地使用了-I选项?原来的GLOBAL_INCLUDES可能自动添加-I,而用户现在手动添加INCLUDES += -I...,这可能会重复添加-I,导致问题。需要确认构建系统是否期望INCLUDES变量包含带有-I的选项,或者是否应该直接添加路径。 可能还需要考虑LOCAL_DIR的定义是否正确。例如,GET_LOCAL_DIR是否返回正确的当前目录,或者是否需要调整。如果LOCAL_DIR被重新定义为某个不同的路径,那么后续的相对路径也会变化。 总结一下,用户的改写是否正确取决于以下几点: 1. LOCAL_DIR的定义是否正确,是否指向了正确的目录。 2. 路径层数是否正确,是否能够正确到达lk2/lib/kcmdline/include。 3. 构建系统如何处理GLOBAL_INCLUDES和INCLUDES变量,是否需要手动添加-I。 需要指出用户的改写可能存在路径计算错误,因为层数减少可能导致路径不正确。同时,直接使用INCLUDES变量可能需要手动添加-I,而原来的GLOBAL_INCLUDES可能由构建系统自动处理。建议用户检查实际路径是否存在,以及构建系统是否支持INCLUDES变量的这种用法。 另外,用户可能想简化路径,或者对Makefile的变量不太熟悉,所以需要详细解释两者的区别,并给出正确的示例,同时提醒他们验证路径的正确性。</think>--- ### 分步分析与解答 #### 一、原写法与改写对比 **原始写法**: ```makefile GLOBAL_INCLUDES += \ $(LOCAL_DIR)/../../../../../lk2/lib/kcmdline/include ``` - **核心逻辑**:通过 `GLOBAL_INCLUDES` 自动添加全局头文件搜索路径,路径回退 **5级** 到项目根目录,再进入 `lk2`。 **用户改写**: ```makefile LOCAL_DIR := $(GET_LOCAL_DIR) # 重新定义LOCAL_DIR为当前模块路径 INCLUDES += -I$(LOCAL_DIR)/../../../lk2/lib/kcmdline/include ``` - **核心逻辑**:手动通过 `INCLUDES` 添加 `-I` 参数,路径回退 **3级** 到项目根目录,再进入 `lk2`。 --- #### 二、改写是否正确的关键问题 **1. 路径层数是否匹配?** 假设原始路径结构如下(根据问题描述推测): ``` 项目根目录 ├── lk │ └── platform/common/oplus_system_debug # 当前模块路径(LOCAL_DIR) └── lk2 └── lib/kcmdline/include/lib/kcmdline.h # 目标头文件 ``` - **从 `oplus_system_debug` 回退到根目录**: - 原始写法 `../../../../../`:需要回退 **5级**(例如 `lk/platform/common/oplus_system_debug → lk/platform → lk → 根目录`)。 - 用户改写 `../../../`:仅回退 **3级**(例如 `oplus_system_debug → platform → common → lk`),**未到达根目录**,导致路径错误。 **结论**:用户改写后的路径回退层级不足,无法正确指向 `lk2`。 --- #### 三、正确修改方案 **方案1:保留原路径逻辑** 直接调整回退层级,确保路径正确: ```makefile LOCAL_DIR := $(GET_LOCAL_DIR) INCLUDES += -I$(LOCAL_DIR)/../../../../../lk2/lib/kcmdline/include ``` **方案2:利用构建系统变量** 若项目已定义根目录变量(如 `PROJECT_ROOT`),可简化路径: ```makefile INCLUDES += -I$(PROJECT_ROOT)/lk2/lib/kcmdline/include ``` --- #### 四、关键差异说明 | 特性 | 原始写法 (`GLOBAL_INCLUDES`) | 用户改写 (`INCLUDES`) | |--------------------|----------------------------------|----------------------------------| | **路径生成方式** | 自动转换为 `-I` 参数 | 手动添加 `-I` 参数 | | **作用范围** | 全局有效(所有模块) | 仅当前模块有效 | | **构建系统兼容性** | 专为LK设计,符合标准实践 | 依赖具体构建系统是否支持 | | **维护性** | 更清晰,避免硬编码 | 需手动管理路径,易出错 | --- #### 五、验证与调试建议 1. **打印实际路径**: 在Makefile中添加调试命令,验证路径计算结果: ```makefile $(info DEBUG: INCLUDES path = $(LOCAL_DIR)/../../../lk2/lib/kcmdline/include) ``` 2. **终端验证路径**: 在项目根目录执行以下命令,检查路径是否存在: ```bash ls -d ./lk/platform/common/oplus_system_debug/../../../lk2/lib/kcmdline/include # 如果输出 "No such file",说明路径错误 ``` 3. **编译日志检查**: 构建时添加 `V=1` 参数查看完整编译命令,确认 `-I` 参数是否指向正确目录: ```bash make V=1 ``` --- #### 六、最终结论 用户改写后的代码 **路径计算错误**,主要问题在于: 1. **回退层级不足**:`../../../` 无法从 `oplus_system_debug` 回退到项目根目录。 2. **变量作用范围不同**:`INCLUDES` 仅影响当前模块,而 `GLOBAL_INCLUDES` 全局生效。 **正确写法应保持原始路径层级**: ```makefile # 方法1:沿用原路径逻辑,修复层级 INCLUDES += -I$(LOCAL_DIR)/../../../../../lk2/lib/kcmdline/include # 方法2(推荐):使用构建系统标准变量 GLOBAL_INCLUDES += $(LOCAL_DIR)/../../../../../lk2/lib/kcmdline/include ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

那个小白猿

讨杯可乐

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

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

打赏作者

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

抵扣说明:

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

余额充值