【发布时间】:2014-01-19 19:23:20
【问题描述】:
我正在编写一个由多个源文件组成的内核模块, 其中一个源文件具有需要由同一模块中的其他对象使用的功能。
它在我的名为 ModemAPI.c 的文件中定义
static void LogMessage ( char *format, ...)
这个c文件应该(连同其他文件)编译成一个内核模块,它的makefile看起来像这样:
obj-m += ModemAPI.o
ModemAPI-objs := ../Common/StateMachine.o ../Common/ElementsPool.o
当我编译这个内核模块时,我在链接过程中收到一个警告,上面的函数“LogMessage”是未定义的,当我尝试加载模块时,我收到一个错误,说它有一个未知符号(当然是 LogMessage) .
编辑:为了清楚起见,函数“LogMessage”是在文件ModemAPI.c中声明和实现的,而且它是通过EXPORT_SYMBOL导出的
EXPORT_SYMBOL(LogMessage);
在使用该函数的文件(如StateMachine.c)中,通过extern声明
extern void LogMessage ( char *format, ...);
模块编译,问题在链接阶段。
有人知道这可能是什么问题吗?
谢谢, 罗伊。
【问题讨论】:
-
我猜,这部分你应该看一次en.wikipedia.org/wiki/Forward_declaration
-
您好,请阅读我通过编辑添加的部分,符号在使用该函数的文件中通过 extern 定义。
标签: makefile linux-kernel kernel linux-device-driver kernel-module