具体为在Linux中添加了两个驱动,一个用于控制CPU的GPIO,一个用于控制主板上的LED灯。
而控制主板的LED灯的驱动需要依赖于控制GPIO的驱动。于是在GPIO的驱动中,利用EXPORT_SYMBOL导出了两个函数,并单独写了一个头文件给LED灯驱动使用。手工编译这两个模块的时候是OK的,但是通过修改Kconfig和Makefile加到Linux中,直接编译Linux会出现如下错误:
drivers/built-in.o: In function `led_ioctl':
psx610e_led.c:(.text+0xfddc): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xfe28): undefined reference to `pxe_gpio_write'
drivers/built-in.o: In function `led_init':
psx610e_led.c:(.text+0xffcc): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0x10010): undefined reference to `pxe_gpio_write'
不知道怎么解决这样的问题。
7 个解决方案
#1
手工编译这两个模块的时候是OK的,但是通过修改Kconfig和Makefile加到Linux中
-I path ?
-I path ?
#2
LED使用的头文件就放在.c文件的相同的目录里面了,直接#include "psx610e_gpio.h",应该头文件是找到了,不然不然编译的时候会因为找不到宏出错。
#3
发现LED驱动依赖于GPIO驱动时,如果我把LED驱动编成模块,而只把GPIO编进内核,就没问题了。
难道是都编进内核时,LED对于GPIO驱动的依赖无法满足,从而使得LED编译出错?不过我已经在Makefile里面把GPIO的驱动先编译了啊。
难道是都编进内核时,LED对于GPIO驱动的依赖无法满足,从而使得LED编译出错?不过我已经在Makefile里面把GPIO的驱动先编译了啊。
#4
出错信息本身是找不到链接的“pxe_gpio_write”,所以这个函数在哪里你把drivers/built-in.o的依赖关系加上就好了。
#5
这个依赖关系怎么添加呢?那个built-in.o是个二进制文件······
#6
可能上次贴的屏幕内容不全,再贴次:
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/linux/compile.h
CC drivers/char/psx610e_gpio.o
CC drivers/char/psx610e_led.o
LD drivers/char/built-in.o
LD drivers/built-in.o
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD vmlinux
drivers/built-in.o: In function `led_ioctl':
psx610e_led.c:(.text+0xbfc0): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc00c): undefined reference to `pxe_gpio_write'
drivers/built-in.o: In function `led_init':
psx610e_led.c:(.text+0xc234): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc260): undefined reference to `pxe_gpio_write'
make: *** [vmlinux] Error 1
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/linux/compile.h
CC drivers/char/psx610e_gpio.o
CC drivers/char/psx610e_led.o
LD drivers/char/built-in.o
LD drivers/built-in.o
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD vmlinux
drivers/built-in.o: In function `led_ioctl':
psx610e_led.c:(.text+0xbfc0): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc00c): undefined reference to `pxe_gpio_write'
drivers/built-in.o: In function `led_init':
psx610e_led.c:(.text+0xc234): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc260): undefined reference to `pxe_gpio_write'
make: *** [vmlinux] Error 1
#7
自己解决了,从gpio出导出的函数被我static了,把static去掉就OK了。
#1
手工编译这两个模块的时候是OK的,但是通过修改Kconfig和Makefile加到Linux中
-I path ?
-I path ?
#2
LED使用的头文件就放在.c文件的相同的目录里面了,直接#include "psx610e_gpio.h",应该头文件是找到了,不然不然编译的时候会因为找不到宏出错。
#3
发现LED驱动依赖于GPIO驱动时,如果我把LED驱动编成模块,而只把GPIO编进内核,就没问题了。
难道是都编进内核时,LED对于GPIO驱动的依赖无法满足,从而使得LED编译出错?不过我已经在Makefile里面把GPIO的驱动先编译了啊。
难道是都编进内核时,LED对于GPIO驱动的依赖无法满足,从而使得LED编译出错?不过我已经在Makefile里面把GPIO的驱动先编译了啊。
#4
出错信息本身是找不到链接的“pxe_gpio_write”,所以这个函数在哪里你把drivers/built-in.o的依赖关系加上就好了。
#5
这个依赖关系怎么添加呢?那个built-in.o是个二进制文件······
#6
可能上次贴的屏幕内容不全,再贴次:
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/linux/compile.h
CC drivers/char/psx610e_gpio.o
CC drivers/char/psx610e_led.o
LD drivers/char/built-in.o
LD drivers/built-in.o
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD vmlinux
drivers/built-in.o: In function `led_ioctl':
psx610e_led.c:(.text+0xbfc0): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc00c): undefined reference to `pxe_gpio_write'
drivers/built-in.o: In function `led_init':
psx610e_led.c:(.text+0xc234): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc260): undefined reference to `pxe_gpio_write'
make: *** [vmlinux] Error 1
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/linux/compile.h
CC drivers/char/psx610e_gpio.o
CC drivers/char/psx610e_led.o
LD drivers/char/built-in.o
LD drivers/built-in.o
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD vmlinux
drivers/built-in.o: In function `led_ioctl':
psx610e_led.c:(.text+0xbfc0): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc00c): undefined reference to `pxe_gpio_write'
drivers/built-in.o: In function `led_init':
psx610e_led.c:(.text+0xc234): undefined reference to `pxe_gpio_write'
psx610e_led.c:(.text+0xc260): undefined reference to `pxe_gpio_write'
make: *** [vmlinux] Error 1
#7
自己解决了,从gpio出导出的函数被我static了,把static去掉就OK了。