今、VisualC++6.0を使って、USB画像のキャプチャをしようとしているのですが、
http://www.katolab.ee.kagu.tus.ac.jp/programing/capture.htm
ここのプログラムがうまくコンパイルできず、
Camera.obj : error LNK2001: 外部シンボル "_CLSID_SampleGrabber" は未解決です
MySampleGrabberCB.obj : error LNK2001: 外部シンボル "_IID_ISampleGrabberCB" は未解決です
Debug/CCameraSample.exe : fatal error LNK1120: 外部参照 2 が未解決です。
というエラーが出てしまいます。きちんと指示どおりやったつもりなのですがどうもうまくいきませんもしよかったらアドバイスいただけないでしょうか?
訂正:USB画像ではなくてUSBカメラの画像です。
編集 削除ISampleGrabberインターフェイスを使用するには
(多分)DirectX8 以上のSDKが必要だったと思います。
この辺りは問題無いですか?
はい、DirectX9.0と8.1bのSDKでやってみましたが、同様のエラーが出てしまいます。
編集 削除> きちんと指示どおりやったつもりなのですがどうもうまくいきません
http://www.katolab.ee.kagu.tus.ac.jp/programing/preparation.htm
たけさんがこのURLを参考にしたとして進めます。
上記の内容に加えて以下の設定も行ってみてください。
1、ツール>オプション>ディレクトリを選択
2、「表示するディレクトリ」で「ライブラリ ファイル」を選択
3、「ディレクトリ」に 「c:\MSSDK\LIB」 を追加して、リストの一番上に移動させる
自分は都合上DirectX7環境を潰す訳にはいかないので動作確認まではできませんが、
おそらく、dxguid.lib 等の必要なライブラリへのリンクができていないのでしょう。
返答遅くてすみません。
そのURLどおりにやりまして、Gakさんの指示通りやってみましたが、エラー内容は変わりませんでした・・・。
dxguid.lib のリンクができていないのだと思ったのだけど・・・違ったかな。
・プロジェクト>設定>リンク>オブジェクト・ライブラリモジュールにdxguid.lib を追加。
・StdAfx.h 辺りに
#pragma comment(lib, "dxguid.lib")
を追記。
上記のどちらかをしていますか?
何度もありがとうございます。
>・プロジェクト>設定>リンク>オブジェクト・ライブラリモジュールにdxguid.lib を追加。
>・StdAfx.h 辺りに#pragma comment(lib, "dxguid.lib")を追記。
どちらもやっていなかったのでそれぞれ追加してみましたが、やはり変化はありませんでした・・・。
dxguid.lib では無く strmiids.lib をリンクしてみて下さい。
参考ページ
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdx8_c/ds/AppDev/Build_Environment.asp
Debug/CCameraSample.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
コレを含めエラーが22個出てしまいました。strmiids.libでは無いようです。
ありゃ、違いましたか。
動作確認をできない自分がこれ以上言っても見当違いな事を連発しそうですね。
たけさんが参考にしたページにはBBSがあるようなのでそちらで聞いてみてはいかがでしょう。
http://www.katolab.ee.kagu.tus.ac.jp/index.html
振り回す形になってしまって申し訳無いです。
振り回すなんてとんでもないです。
もうちょっと頑張ってみます。本当にありがとうございました。
VC++付属の古いライブラリをリンクしてませんか?
VC++付属のDirectXのライブラリはDirectX7.0以前なので
SampleGrabberを含みません。
今、DirectX8.1SDKにリンクしているのですが、それとは違うのでしょうか。もし見当違いのことを言っていたらすみません。
編集 削除ライブラリディレクトリのパスはDirectX8.1SDKのLibとBaseClassesのLibが
優先してますよね?
VC++のメニューの「ツール」ー「オプション」−「ディレクトリ」で確認。
優先というのは、上に置くということですよね。
それでしたらやっているのですが、エラーになってしまいます・・・。
DirectX8.1SDKの中にSampleGrabberではなく、Grabberというのがあるのですが、これは関係ないのでしょうか?
編集 削除うーん、よくわからんなあ。
非常手段として2つのシンボルを直接定義しちゃうとか。
qedit.h を見ると
IID_ISampleGrabberCBは 0579154A-2B53-4994-B0D0-E773148EFF85
CLSID_SampleGrabberは C1F400A0-3F08-11d3-9F0B-006008039E37
static const GUID <<name>> =
{ 0xaaaaaaaa, 0xbbbb, 0xcccc, { 0xdd, 0xee, 0xff, 0xaa, 0xbb, 0xcc, 0xdd, 0xee } };
の形式で。
ボノコン教徒さん、すいません・・・。
それはどのようにすればよいのでしょうか?
static にする必要もないか。
どこかのソースに以下を埋め込む。
const GUID IID_ISampleGrabberCB =
{ 0x0579154A, 0x2B53, 0x4994,
{0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85}};
CLSID_SampleGrabberも同様。
strmbase.lib(デバッグ版はstrmbasd.lib)は DirectX8.1SDK
で自力でビルドしてからリンクしてますか?
今、初めて気がついたんだが、8.1以降ではstrmbase.libを自力で
作らなきゃいけないみたい。
samples\Multimedia\DirectShow\BaseClasses を自力でビルドして
出来上がったstrmbase.lib(デバッグ版はstrmbasd.lib)をリンクして
くださいな。
お返事遅くなりました。
>非常手段として2つのシンボルを直接定義
これで実行する事ができました。(strmbasd.libはリンクしてありました。)
ありがとうございました。
解決のチェック入れ忘れました・・・
編集 削除http://www.katolab.ee.kagu.tus.ac.jp/programing/capture.htm
のプログラムをビルドすると
fatal error C1083: インクルード ファイルがオープンできません。'stdafx.h': No such file or directory
cl.exe の実行エラー
と出ます。これはどのようにしたらエラーが出なくなりますか?
MySampleGrabberCB.hをヘッダーファイル、
MySampleGrabberCB.cppをソースファイルにするというやり方では間違えているのですか?
http://www.katolab.ee.kagu.tus.ac.jp/programing/preparation.htm
のプログラミングの準備はしました。
もし、よかったら教えてください。