質問

私はチュートリアルのコードライブラリを使用しており、非静的なメンバー関数の関数ポイントを静的関数ポインターを期待する関数に渡す機能を提供するための機能を提供しています。おそらく私が訴えているものを知るのに役立つので、ここにリンクがあります http://www.codeproject.com/kb/cpp/thunk32.aspx このコードでは、Boost Libraryを使用しています。

サンクライブラリには、ヘッダーファイルの1つが読み取るセクションがあります

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
??=include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

しかし、これにより壮大な量のエラーが得られます。

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
#include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

ダウンロードされたこのコードは、私のソリューションに2番目のプロジェクトとして含まれており、喜んでコンパイルして構築できます。しかし、このコードを使用している私のプロジェクトにはリンクがあり、人々が尋ねることを救うために、私はこれらのエラーメッセージを受け取ります

1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::Thunk32Base(void)" (??0Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??0?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::~Thunk32Base(void)" (??1Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::~Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??1?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol _capCreateCaptureWindowA@32 referenced in function "public: bool __thiscall WebCamera::Init(struct HWND__ *)" (?Init@WebCamera@@QAE_NPAUHWND__@@@Z)

これは、コンストラクターとデストラクタが宣言されておらず、私のwebcamera.init()もめちゃくちゃになっていると言っていると思います。 Thunk32プロジェクトのエクスポートが他のプロジェクトに含まれていることを確認しましたが、それでもこれらのエラーが発生します。

正しい仮定をしたかどうか知りたい ??=include に変更されるべきでした #include もし私が持っている場合、私が間違ったことをしたか、そうしなかったのか、これらのリンカーエラーが発生します。または、驚くべき非静的なメンバー関数に関数ポインターを渡すことができる別の方法を私に提供できる場合。

ありがとう

役に立ちましたか?

解決 4

わかりました、だから私は今これを解決することができました。

マイケル・バー ニクリーはそう言った ??= 基本的にタイピングと同じです # しかし、ハッシュシンボルを持っていない人がそれを入力できるように、 C ++のトライグラフシーケンスの目的?

ハンス・パサント それから私のためにボールを転がして、私が物に完全にリンクしていなかったことを私に知らせてくれました。メインプロジェクトを右クリックし、「プロジェクトの依存関係」を選択し、Thunk32コードがある他のプロジェクトを選択する必要がありました。また、サンクプロジェクトがLIBを保存している場所を確認するためにメインプロジェクトに伝える必要がありました。また、thunk32d.libを追加する必要がありました(私はデバッグモードであったので、「D」に注意してください。ハンスは私が必要だと言った winmm.lib しかし、それは判明しました(私に必要なエラーを与えていた関数をグーグルで調べたとき Vfw32.lib 代わりは。

みんなありがとう!このような完全な答えを与えることで、同様の問題を抱えている他の人を助けることができることを願っています。

他のヒント

??= の「トライグラフ」シーケンスです # キャラクター。標準によれば、トリグラフは処理の最初のステップの1つとして処理されることになっています(プリプロセッサがディレクティブを処理する前のフェーズ1で)。

??=include "whatever"

次のことに相当する必要があります。

#include "whatever"

それで、あなたはそのフォームを使用できるはずです(なぜトライグラフがそもそもそこに置かれたのだろうか - おそらくある種の邪悪な冗談?)

ただし、トリグラフは問題と混乱を引き起こします(おそらく彼らが助けるよりも多く)ので、コンパイラはそれらについて警告に向かって動いているように見えます。 VS 2010のコンパイラは、デフォルトでトリグラフ処理をオフにしています - あなたは /Zc:trigraphs 電源を入れるオプション。

見る C ++のトライグラフシーケンスの目的? 詳細については。

ああ、エイナー、いい男。最近フラッシュとシェアポイントのものをしている、痛い。ノルウェー人は、トライグラフを説明するかもしれません。

anyhoo、複雑なことはありません。リンカーにいくつかのライブラリを見るように言うのを忘れていました。プロジェクト、プロジェクトの依存関係を右クリックし、サンクプロジェクトにチェックします。これにより、thunk32.libがCTORとDTORを見て解決することを確認します。

もう一度右クリックし、プロパティ、リンカー、追加の依存関係、「winmm.lib」を追加します。これにより、CapCreateCaptureWindowシンボルが解決されます。

CPPファイルで定義するのを忘れたIndev :: Thunk32Baseクラスで、コンストラクターとデストラクタが宣言されていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top