【问题标题】:Why can make work here?为什么可以在这里工作?
【发布时间】:2011-07-20 06:45:50
【问题描述】:

生成文件:

KERNEL_DIR := /usr/src/linux-2.6.32.9

obj-m := try.o

driver:     try.c
    make -C $(KERNEL_DIR) SUBDIRS=`pwd` modules
clean:
    rm -rf *.o *.ko *.mod.c

当我输入make,make -C $(KERNEL_DIR) SUBDIRS=pwdmodules 运行时,就像make driver 运行一样,为什么?

【问题讨论】:

    标签: linux makefile


    【解决方案1】:

    make 如果在没有参数的情况下调用,则从 makefile 运行第一个可能的东西。 obj-mKERNEL_DIR 不是规则,它们是变量。 driver 是要遵循的第一条规则。

    【讨论】:

    • 但是在driver 中没有try.o,怎么办?
    • obj-m(和KERNEL_DIR)不是目标,而是变量。 driver 是第一个目标,因此如果在调用时没有给出具体目标,则由 make 执行
    • 不是:=指定的依赖,不是:吗?
    • 这里有点混乱。 @jho:不,:=: 不都是依赖声明;只有最后一个是。第一个是变量赋值,类似于=;要了解差异,请参阅GNU make manual (paragraph 6.2)。 @assem:单个冒号 (:) 分隔目标及其依赖项。
    • @assem:我不明白你的问题。 “它不带任何参数”是什么意思?这只是一个在目录$(KERNEL_DIR) 中运行make 的命令,变量SUBDIRS 设置为当前目录,并指示make 构建目标modules。目录$(KERNEL_DIR) 中应该有一个Makefile,其中包含描述如何更新modules 的规则。
    【解决方案2】:

    如果在没有指定目标的情况下调用 make,make 会选择 makefile 中的第一个目标作为目标。在这种情况下,它是driverobj-mKERNEL_DIR 只是变量赋值,不是目标。

    【讨论】:

    • 你能谈谈make driver到底发生了什么吗?
    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多