编译Linux时遇到undefined reference to

时间:2022-07-17 05:35:21
最近在向Linux中添加一些驱动,用于支持现行的主板。
具体为在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 ?

#2


LED使用的头文件就放在.c文件的相同的目录里面了,直接#include "psx610e_gpio.h",应该头文件是找到了,不然不然编译的时候会因为找不到宏出错。

#3


发现LED驱动依赖于GPIO驱动时,如果我把LED驱动编成模块,而只把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

#7


自己解决了,从gpio出导出的函数被我static了,把static去掉就OK了。

#1


手工编译这两个模块的时候是OK的,但是通过修改Kconfig和Makefile加到Linux中



-I  path ?

#2


LED使用的头文件就放在.c文件的相同的目录里面了,直接#include "psx610e_gpio.h",应该头文件是找到了,不然不然编译的时候会因为找不到宏出错。

#3


发现LED驱动依赖于GPIO驱动时,如果我把LED驱动编成模块,而只把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

#7


自己解决了,从gpio出导出的函数被我static了,把static去掉就OK了。