c - 尽管在 Linux 内核模块中有 EXPORT_SYMBOL,如何防止 "error: ' 符号在这里未声明?

标签 c linux-kernel linux-device-driver i2c

当我遇到这个错误时,我正在将一些驱动程序嵌入到 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 文件没有头文件(我没有写它,我只是找到它 here 并且我正在实现。他们说它已经过测试所以我假设不需要头文件?

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

最佳答案

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

选项 1:

kxtf9.h:

#ifndef KXTF9_H
#define KXTF9_H

struct ext_slave_descr *kxtf9_get_slave_descr(void);

#endif

你的文件.c:

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

选项 2:

你的文件.c:

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

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

关于c - 尽管在 Linux 内核模块中有 EXPORT_SYMBOL,如何防止 "error: ' 符号在这里未声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670589/

相关文章:

c - 如何在 c 中隐藏公共(public) API 的辅助函数

c - 为什么 mac OS X 不会在此代码中抛出运行时错误?

c - LzmaLib : compress/decompress buffer in C

linux-kernel - 如何从内核代码触发KDB?

linux - Linux 内核中的 TCP 调用流程

c - 设备驱动程序和轮询中的中断处理

c - 比较速度与设置变量的速度

debugging - utrace 项目死了吗?

linux - 如何在不运行 mknod 的情况下让 Linux 字符设备自动显示在/dev 中?

linux - 如何在 debian 中安装 man 命令的第 9 节