编译3.10内核 出现错误 “undefined reference to...." 解决方法

向内核中添加C文件后,如果想编译进内核需要修改当前目录下的Kconfig文件和Makefile文件。

如:添加一个test.c文件到driver目录下,则需要修改Kconfig文件:

config MY_TEST
        tristate "MY_TEST file "
        depends on  I2C
        ---help---
          This is test file about kernel

同样修改Makefile添加一行:

obj-$(CONFIG_MY_TEST) += test.o
这样执行make menuconfig 可以看到MY_TEST file这一行,有三种状态:编译进内核,编译成模块,或者不编译。


以前一直以为Kconfig文件修改没有限制,今天编译内核时,没有注意添加位子,随便找了个地方将新文件的配置选项添加进去,编译的时候报错如下:

clk-composite.c:(.text+0x22f25c): undefined reference to `foreground_sdc_select'
clk-composite.c:(.text+0x22f274): undefined reference to `bg_overlay_sdc_select'
drivers/built-in.o: In function `stop_preview':
clk-composite.c:(.text+0x22f2e4): undefined reference to `foreground_sdc_deselect'
clk-composite.c:(.text+0x22f2f0): undefined reference to `bg_overlay_sdc_deselect'
drivers/built-in.o: In function `mxc_v4l_open':
clk-composite.c:(.text+0x22ff28): undefined reference to `csi_enc_select'
clk-composite.c:(.text+0x22ff54): undefined reference to `prp_enc_select'
经过网行一番查找,得知典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,或者说编译顺序有错误。

也就是该c文件调用了其他地方的函数,但是在调用的文件之前编译了,可定找不到将要调用的函数,所以报错了。

详细解释见:http://www.educity.cn/linux/1241992.html

所以在Kconfig中添加代码需要讲究位子,最好添加在代码功能相近的文件附近。

你可能感兴趣的:(linux内核)