Dynamic 向内核模块添加DKMS支持时出现的问题

Dynamic 向内核模块添加DKMS支持时出现的问题,dynamic,module,kernel,Dynamic,Module,Kernel,我试图在我正在开发的内核模块中添加DKMS支持 我已将带有要链接的静态库的内核模块源代码放在以下目录中: /usr/src/dpx/1.0 使用以下文件: dkms.conf Makefile dpxmtt.c lib.a dkms.conf文件如下所示: MAKE="make" CLEAN="make clean" BUILT_MODULE_NAME=dpx BUILT_MODULE_LOCATION=src/ DEST_MODULE_LOCATION=/kernel/drivers/in

我试图在我正在开发的内核模块中添加DKMS支持

我已将带有要链接的静态库的内核模块源代码放在以下目录中:

/usr/src/dpx/1.0
使用以下文件:

dkms.conf
Makefile
dpxmtt.c
lib.a
dkms.conf文件如下所示:

MAKE="make"
CLEAN="make clean"
BUILT_MODULE_NAME=dpx
BUILT_MODULE_LOCATION=src/
DEST_MODULE_LOCATION=/kernel/drivers/input/touchscreen
PACKAGE_NAME=dpxm
PACKAGE_VERSION=1.0
REMAKE_INITRD=yes
EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += dpx.o
dpx-objs:= dpxmtt.o ../source/lib.a

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

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
生成文件如下所示:

MAKE="make"
CLEAN="make clean"
BUILT_MODULE_NAME=dpx
BUILT_MODULE_LOCATION=src/
DEST_MODULE_LOCATION=/kernel/drivers/input/touchscreen
PACKAGE_NAME=dpxm
PACKAGE_VERSION=1.0
REMAKE_INITRD=yes
EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += dpx.o
dpx-objs:= dpxmtt.o ../source/lib.a

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

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
../source/lib.a是一个黑客攻击,因为当dkms构建系统调用makefile时,它说在目录(构建目录)中找不到它,但由于它被复制到了源目录,所以我相对地引用了它

当我打电话时

sudo dkms build -m dpx -v 1.0
结果几乎是完美的:

santos@NS-PC:~$ sudo dkms build -m dpx -v 1.0

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=3.0.0-14-generic....
ERROR (dkms apport): binary package for dpx: 1.0 not found
Error!  Build of dpx.ko failed for: 3.0.0-14-generic (i686)
Consult the make.log in the build directory
/var/lib/dkms/dpx/1.0/build/ for more information.
nsantos@NS-PC:~$ 
日志文件的内容为:

DKMS make.log for dpx-1.0 for kernel 3.0.0-14-generic (i686)
Thu Jan 19 11:07:54 WET 2012
make -C /lib/modules/3.0.0-14-generic/build M=/var/lib/dkms/dpx/1.0/build modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-14-generic'
  CC [M]  /var/lib/dkms/dpx/1.0/build/dpxmtt.o
  LD [M]  /var/lib/dkms/dpx/1.0/build/dpx.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /var/lib/dkms/dpx/1.0/build/dpx.mod.o
  LD [M]  /var/lib/dkms/dpx/1.0/build/dpx.ko

make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-14-generic'
模块构建正确,但以错误结束:

ERROR (dkms apport): binary package for dpx: 1.0 not found
Error!  Build of dpx.ko failed for: 3.0.0-14-generic (i686)

我不知道这是什么意思。有人知道吗?

我也有类似的问题。我认为您的
内置模块位置
被错误地设置到
src
目录。在您的示例中,它应该设置为当前目录,或者您可以省略此变量,dkms将默认为当前目录。

使用:

$(shell uname-r)

在Makefile中,它也可能是错误的!“shell uname-r”指的是当前正在运行的内核,但使用dkms的主要原因是它提供了一种自动方法来为每个新安装的内核重新编译位于内核树之外的内核模块。我的意思是,Makefile可能引用dkms为其构建模块的不同内核

使用:

${kernelver}