Как предотвратить "error: 'symbol' undeclared here" несмотря на EXPORT_SYMBOL в модуле ядра Linux? - PullRequest
6 голосов
/ 13 июля 2011

Когда я получаю эту ошибку, я встраиваю какой-то драйвер в ядро ​​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, содержащий приведенный выше код, не имеет заголовочного файла (я не писал его, я просто нашел его здесь , и я его реализую. Говорят, что он проверен, поэтому я предполагаю, что заголовок не нужен?

Остальная часть кода прекрасно компилируется (поэтому он «видит» код в папке), и файл, содержащий приведенный выше код, также компилируется!

1 Ответ

10 голосов
/ 13 июля 2011

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 ... */

Также обратите внимание, что EXPORT_SYMBOL в файле kxtf9.c имеет #ifdef __KERNEL__ вокруг него, поэтому вы должны правильно настроить среду сборки (Makefile) - иначе вы получите ошибку ссылки.

...