如何从Makefile向程序传递参数?传递Makefile所在目录方法
如何在Makefile中传递自身所在目录给程序并保证跨目录运行
没问题,这事儿其实挺简单的,我给你拆解成几步,确保你的程序不管在哪个目录跑都能拿到正确的Makefile所在路径:
1. 配置Makefile:获取绝对目录并传递参数
首先要在Makefile里拿到自身所在的绝对路径(这是跨目录运行的关键,相对路径在其他目录会失效)。你可以用下面的表达式定义DIR变量:
# 定义Makefile所在的绝对目录 DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) # 基础编译配置 CC := gcc TARGET := my_program SRCS := main.c # 编译规则 $(TARGET): $(SRCS) $(CC) -o $@ $^ # 运行规则:自动传递目录参数 run: $(TARGET) ./$(TARGET) $(DIR)
解释一下这个DIR的写法:
$(MAKEFILE_LIST)会列出当前正在处理的Makefile文件lastword取列表里最后一个(也就是当前你写的这个Makefile)abspath把路径转换成绝对路径(比如从./Makefile变成/home/you/project/Makefile)dir提取路径里的目录部分(也就是/home/you/project/)
这样不管你从哪个目录调用make,DIR都是Makefile所在的真实绝对目录。
2. 编写C程序:接收并使用参数
在你的main函数里,记得先检查参数数量(避免用户忘传参数导致崩溃),然后获取argv[1]即可:
#include <stdio.h> int main(int argc, char* argv[]) { // 先检查是否传入了参数 if (argc < 2) { fprintf(stderr, "用法: %s <Makefile所在目录>\n", argv[0]); return 1; } char* directory = argv[1]; printf("拿到的Makefile目录: %s\n", directory); // 在这里写你的业务逻辑,比如读取目录下的文件之类的 return 0; }
3. 验证跨目录运行
比如你的Makefile在/home/you/my_project目录下:
- 正常在项目目录运行:
make run,程序会输出/home/you/my_project/ - 切换到其他目录(比如
/tmp)运行:make -f /home/you/my_project/Makefile run,程序依然会输出正确的绝对目录,完全不受当前工作目录影响。
如果不想用make run,编译后手动运行的话,只要把Makefile所在的绝对目录作为第一个参数传给程序就行,比如:./my_program /home/you/my_project/。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

