尽管在Linux内核模块中使用EXPORT_SYMBOL,如何防止“错误:’符号’未声明”?

当我收到此错误时,我将一些驱动程序嵌入到Linux内核中(我在板文件中添加设备并注册它):

error: 'kxtf9_get_slave_descr' undeclared here (not in a function) 

我将上面的函数放在驱动程序文件中

 struct ext_slave_descr *kxtf9_get_slave_descr(void) { return &kxtf9_descr; } EXPORT_SYMBOL(kxtf9_get_slave_descr); 

它不应该由EXPORT_SYMBOL“可见”吗? 包含上面代码的C文件没有头文件(我没有写它,我只是在这里找到它并且我正在实现。他们说它已经过测试所以我假设不需要头文件?

其余代码编译完美(因此它“看到”文件夹中的代码),包含上面代码的文件也编译完成!

EXPORT_SYMBOL导出动态链接的符号。 你所拥有的不是链接错误,而是由于缺少函数声明而导致的编译错误。 您必须为C文件编写头文件并包含该头文件,或者将该函数声明为您正在编译的C文件。

选项1:

kxtf9.h:

 #ifndef KXTF9_H #define KXTF9_H struct ext_slave_descr *kxtf9_get_slave_descr(void); #endif 

your_file.c:

 #include "kxtf9.h" /* your code where you use the function ... */ 

选项2:

your_file.c:

 struct ext_slave_descr *kxtf9_get_slave_descr(void); /* your code where you use the function ... */ 

另请注意,文件kxtf9.c中的EXPORT_SYMBOL周围有#ifdef __KERNEL__ ,因此您必须正确设置构建环境(Makefile) – 否则会出现链接错误。