You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:33