混乱による未解決の外部記号エラー
-
20-09-2019 - |
質問
私がいるというラッパーをもとに図書館VC++'sコンパイラです。
ErlDriver.c
#define __WIN32__
#define DLL_EXPORT __declspec(dllexport)
#include "erl_driver.h"
DLL_EXPORT int _driver_output(ErlDrvPort port, char *buf, int len) {
return driver_output(port, buf, len);
}
ます。バット
cl /I%ERL_DRIVER_H% /LD /MD ErlDriver.c
ようとするとこを取得し、以下のリンカーエラー:
ErlDriver.obj:エラー LNK2019:未解決の外部記号_WinDynDriverCallbacks参照される関数__ドライバ_出力
erl_win_dyn_driver.h に含まれてい erl_driver.h)
typedef struct {
WDD_FTYPE(driver_output) *driver_output;
// a ton more of those
} TWinDynDriverCallbacks;
extern TWinDynDriverCallbacks WinDynDriverCallbacks;
#define driver_output (WinDynDriverCallbacks.driver_output)
なので、ご覧の通り、WinDynDriverCallbacksは 定義 宣言しています。
何が起こるリンカーエラーになるのだろうか?
解決
あの微妙な違い"を宣言する"何か"を定義する"のではCまたはC++.きを宣言するので、このコンパイラが一定のシンボルを定義するか-このコードを使用する記号なく、実際の定義で設定します。まだ定義のシンボルのどこかにコードで連動もしくはエラーメッセージです。
例えば、この宣言のシンボル WinDynDriverCallbacks
:
extern TWinDynDriverCallbacks WinDynDriverCallbacks;
コードは、この宣言-このコードを使用するシンボルの成功にコンパイルなしている。
を追加する必要があります、どこかで定義:
TWinDynDriverCallbacks WinDynDriverCallbacks;
定義に入れなければなプロセスにおけるソースコードのファイルのどこかには一般的にヘッダーファイル).これはコンパイラの空間を割り当てるオブジェクトのコードをそのオブジェクトでは、プログラムへのリンクが成功しました。
他のヒント
また、定義されていない(少なくともいくつかり引用).この宣言しています。の"extern"キーワードは"の定義このシンボルが表示され、別の作成ユニット(ソースファイル." が必要との連携オブジェクトファイル(または図書館)から生産された統のソースファイルを定義することを象徴の一つです。
私も同様の問題を築くごWindows上でしか利用できません。未解決の外部記号_WinDynNifCallbacks.がこの定義がすでにERL_NIF_INITマクロ、私の場合、全体のマクロが必要で囲まれextern Cブロックです。
ieことに失敗した
extern "C" ERL_NIF_INIT(...)
この成功
extern "C"
{
ERL_NIF_INIT(...)
}
私はこの問題によるものと同じ問題がDRIVER_INITマクロのためには、gimp用ドキュメポートドライバーです。
Driver_Initがメインのループを宣言する"TWinDynDriverCallbacks WinDynDriverCallbacks;"で適切に宣言された複数のラインを定義するdriver_init.なんかが必要でとれたextern"c"
このスレッドが約万回できるように設定マbarebones gettextポートドライバをまということになる。私のジョー-アームストロング-プログラミングのgettext書第12章インターフェースです。使用erl5.9vs2010.
このコードを書いた漏れや誤りexample1_lib.c.あのエラが、本書の対gimp用ドキュメ版に変わります。
に必要なセット(#define WIN32)のプexample1_lib.cその他gimp用ドキュメデフォルトした、Linuxです。
第二に必要な変更(int bufflen)(ErlDrvSizeT bufflen)example_drv_output.
その後、内蔵。