【问题标题】:Why does my Makefile build an non-existent source file?为什么我的 Makefile 构建一个不存在的源文件?
【发布时间】:2016-12-04 10:08:54
【问题描述】:

我有以下 makefile 应该构建 procdriver.c 并因此输出一个 .ko 文件。问题是,即使我删除了 procdriver.c,我的 makefile 似乎也能够构建一个 procdriver.ko 文件。我想尝试找出它每次从哪里获取它正在构建的源文件。

TARGET = procdriver

obj-m := procdriver.o 
procdriver-objs+= gpioLib.o

KDIR:= /home/pi/myRpi/linux
PWD := $(shell pwd)

all: gpioLib.o procdriver.c
    echo<<"in all"
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
    rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers 



gpioLib.o: gpioLib.c gpioLib.h 
    gcc -c gpioLib.c -o gpioLib.o

clean:
    make -C $(KDIR) SUBDIRS=$(PWD) clean

这是 Makefile 的输出:http://paste.ubuntu.com/23575533/

编辑

remake 命令的全部输出:http://paste.ubuntu.com/23577274

我认为这是输出中最重要的一点:http://pastebin.com/0vj9aNMg

【问题讨论】:

  • 通常 makefile 不会构建源文件。
  • @Olaf 在这种情况下你有什么建议?因为当我删除 procdriver.c 时,它会输出一个 procdriver.ko 文件。这是不应该发生的。
  • 使用remake调试Makefile-s
  • @BasileStarynkevitch 谢谢我尝试了 remake 命令我认为这是输出中最重要的一点:pastebin.com/0vj9aNMg 正如你突然看到的那样,它仍然可以制作 procdriver.o
  • @Olaf 通常 Makefiles 至少会尝试构建源文件(从 yacc/lex 文件,或通过检查 RCS 或 SCCS 文件。)但我认为这不是问题所在......

标签: c linux makefile compilation


【解决方案1】:
obj-m := procdriver.o 
procdriver-objs+= gpioLib.o

错了。它说模块的唯一目标文件是procdriver.o 并且构建系统将从procdriver-objs生成那个

procdriver-objs 最初为空,因此变为 = gpioLib.o。所以gpioLib.oprocdriver.o的唯一对象前提;因此gpioLib.cgpioLib.hprocdriver.o 的唯一源先决条件。 procdriver.c 是多余的。

你想(我相信)从一对目标文件 procdriver.ogpioLib.o 中创建一个模块, 分别从对应的.c文件编译而来。你需要表达的方式是:

obj-m += my-module-name.o
my-module-name-objs := procdriver.o gpioLib.o

您必须重新考虑文件名以避免my-module-name.o 之间的冲突 和procdriver.o。请参阅文档The Linux Kernel Module Programming Guide: 2.7. Modules Spanning Multiple Files

makefile 的大部分内容都是多余的。据我所知 需求是:

obj-m += my-module-name.o
my-module-name-objs := procdriver.o gpioLib.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

gpioLib.o: gpioLib.h

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2020-03-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多