![编译驱动程序时出现问题:“没有规则可以创建目标”](https://linux22.com/image/32132/%E7%BC%96%E8%AF%91%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98%EF%BC%9A%E2%80%9C%E6%B2%A1%E6%9C%89%E8%A7%84%E5%88%99%E5%8F%AF%E4%BB%A5%E5%88%9B%E5%BB%BA%E7%9B%AE%E6%A0%87%E2%80%9D.png)
首先,我正在运行 CentOS 6.4 安装。我的电脑是笔记本电脑,我正在尝试安装以太网卡的驱动程序,因为本周末我失去了连接互联网的能力。
所以我下载了驱动程序:jmebp-1.0.8.5
我安装了 gcc、kernel-devel,由于它不起作用,我最终安装了组开发工具(以防我忘记了一些东西)。
当我
make install
我收到此错误:
*** No rule to make target `internet/jmebp-1.0.8.5'. Stop.
Leaving directory `/lib/modules/2.6.32-358.6.1.el6.x86_64/build'
我的生成文件是:
MODNAME := jme
obj-m := $(MODNAME).o
ifneq ($(KERNELRELEASE),)
#########################
# kbuild part of makefile
#########################
EXTRA_CFLAGS += -Wall -O3
#EXTRA_CFLAGS += -DTX_DEBUG
#EXTRA_CFLAGS += -DREG_DEBUG
else
#########################
# Normal Makefile
#########################
TEMPFILES := $(MODNAME).o $(MODNAME).mod.c $(MODNAME).mod.o Module.symvers .$(MODNAME).*.cmd .tmp_versions modules.order Module.markers Modules.symvers
ifeq (,$(KVER))
KVER=$(shell uname -r)
endif
KSRC ?= /lib/modules/$(KVER)/build
MINSTDIR ?= /lib/modules/$(KVER)/kernel/drivers/net
all: modules
@rm -rf $(TEMPFILES)
modules:
@$(MAKE) -C $(KSRC) M=$(shell pwd) modules
checkstack: modules
objdump -d $(obj-m) | perl $(KSRC)/scripts/checkstack.pl $(shell uname -m)
@rm -rf $(TEMPFILES)
namespacecheck: modules
perl $(KSRC)/scripts/namespace.pl
@rm -rf $(TEMPFILES)
install: modules
install -m 644 $(MODNAME).ko $(MINSTDIR)
depmod -a $(KVER)
patch:
@/usr/bin/diff -uar -X dontdiff ../../trunc ./ > bc.patch || echo > /dev/null
buildtest:
SRCDIRS=`find ~/linux-src -mindepth 1 -maxdepth 1 -type d -name 'linux-*' | sort -r -n`; \
SRCDIRS="$${SRCDIRS} `find ~/linux-src/centos -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n`"; \
SRCDIRS="$${SRCDIRS} `find ~/linux-src/fedora -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n`"; \
for d in $${SRCDIRS}; do \
$(MAKE) clean && $(MAKE) -C . KSRC=$${d} modules; \
if [ $$? != 0 ]; then \
exit $$?; \
fi; \
done
$(MAKE) clean
clean:
@rm -rf $(MODNAME).ko $(TEMPFILES)
%::
$(MAKE) -C $(KSRC) M=`pwd` $@
endif
有什么建议 ?
答案1
首要问题
你丢失了kernel-headers
包裹。您需要这些来编译内核模块。
yum install kernel-headers
假设这是您下载驱动程序的地方从。当我在 CentOS 6.4 系统上解压它们时,出现以下错误:
$ cd jmebp-1.0.8.5
$ ls
CHANGELOG jme.c jme.h Makefile scripts
$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory. Stop.
make: *** [modules] Error 2
安装kernel-headers
包后,我运行了make
第二次:
$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory. Stop.
make: *** [modules] Error 2
还有问题吗?进一步调试它,我发现了我的另一个问题,您也可能会遇到这个问题,所以我在下面记录它,以防万一。
第二期
内核目录中的链接似乎已损坏。
$ pwd
/lib/modules/2.6.32-279.14.1.el6.x86_64
$ ls -l | grep build
lrwxrwxrwx 1 root root 51 Dec 15 14:49 build -> ../../../usr/src/kernels/2.6.32-279.14.1.el6.x86_64
lrwxrwxrwx 1 root root 5 Dec 15 14:50 source -> build
$ ls -l build/
ls: cannot access build/: No such file or directory
kernel-headers
糟糕,我们的内核版本的和 的版本错误kernel-devel
。我们当前正在运行这个版本的内核:
$ uname -r
2.6.32-279.14.1.el6.x86_64
但我们刚刚安装了该版本的kernel-headers
和软件包:kernel-devel
2.6.32-358.6.1.el6.x86_64
因此,让我们也安装该版本的内核并重新启动,以便我们可以使用较新的内核:
$ yum update kernel
重新启动后,一切看起来好多了:
$ ls
CHANGELOG jme.c jme.h Makefile scripts
$ make
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'
CC [M] /home/sam/jmebp/jmebp-1.0.8.5/jme.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/sam/jmebp/jmebp-1.0.8.5/jme.mod.o
LD [M] /home/sam/jmebp/jmebp-1.0.8.5/jme.ko.unsigned
NO SIGN [M] /home/sam/jmebp/jmebp-1.0.8.5/jme.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'
$ ls
CHANGELOG jme.c jme.h jme.ko jme.ko.unsigned Makefile scripts
现在我们看到 jme.ko 内核模块。要安装它:
make install