1

コールバック関数を使おうとしています。これは、呼び出し元と呼び出された関数が同じファイルにある場合に正常に機能しました。最近、呼び出された関数をライブラリの一部にすることにしました。そのため、独自のファイルで定義されたヘッダーファイルで宣言しました。呼び出し元のソースファイルに新しいヘッダーを#includeして、新しいライブラリにリンクすると、コールバック関数への「未定義の参照」エラーが発生します。

この作品を作るために私がしなければならない特別なことはありますか?たとえば、pthreadライブラリで同じものを使用すると、コールバック関数がポインタ関数として定義されていることに気付きます。

編集:ライブラリにリンクしています。ライブラリ内の他の関数を問題なく呼び出すことができます。

4

3 に答える 3

2

考えられる問題:

  1. 関数の定義 (.c ファイル内) がその宣言 (.h ファイル内) と一致せず、この関数を使用するコードは基本的に、実際にヘッダー ファイルにあるものではなく、ヘッダー ファイルにあるものを見つけるようにリンカに指示します。図書館。

  2. 関数を実装するファイルをコンパイルするか、結果のオブジェクト ファイルをライブラリに配置するのを忘れたため、リンカーはライブラリで関数を見つけることができません。

  3. いくつかのソース ファイルが開いていて保存されておらず、エディターでは問題なく完成しているように見えますが、ディスク上の内容が異なり、コードをコンパイルしようとすると何かがおかしい場合があります。

  4. make関数を実装するファイルをコンパイルする必要がないか、既にコンパイルされていて再コンパイルする必要がないと考えさせる (悪いメイクファイル?) にいくつかの問題があります。メイクファイルを修正するか、オブジェクト ファイルとライブラリ ファイルを削除すると、問題が修正されます。

  5. C と C++ のコードが混在しており、C++ の名前マングリングが原因で問題が発生しています。を使用extern "C" { }すると、ここで役立つ場合があります。

  6. その関数を として定義したstaticので、リンク時に他のモジュール (.c ファイル) では見えません。削除staticすると役立ちます。

于 2012-10-18T01:03:26.860 に答える
1

問題は、ヘッダーに 2 回定義があり、1 つは静的で、もう 1 つは静的ではないことが判明しました。

于 2012-10-30T17:24:06.580 に答える
0

ヘッダーを含めて、コールバックを実装する実際のコードにリンクする必要があります。

したがって、アプリケーションがライブラリにリンクする必要があるように聞こえます。もちろん、ライブラリ内の関数を呼び出すために、アプリケーションはすでにリンクしている必要があります。

于 2012-10-17T15:12:07.593 に答える