6

このエラーが発生したときに、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ファイルにはヘッダーファイルがありません(私はそれを書きませんでした、ここで見つけて実装しています。彼らはそれがテストされていると言っているので、ヘッダーは必要ないと思いますか?

残りのコードは完全にコンパイルされ(したがって、フォルダー内のコードを「認識」します)、上記のコードを含むファイルもコンパイルされます。

4

1 に答える 1

10

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)を正しく設定する必要があります。そうしないと、リンクエラーが発生します。

于 2011-07-12T20:31:10.740 に答える