- ベストアンサー
Borland C++でdirectXのサンプルのエラーを解決する方法
- Borland C++でdirectXのサンプルをコンパイルする際に、未解決表示のエラーが出てくることがあります。
- 具体的には、CD3DEnumeration、CD3DApplication、CD3DFont、D3DXMatrixLookAtLHのメンバ関連のエラーが発生します。
- これらのエラーを解消するためには、コンパイル時に必要なライブラリやヘッダーファイルが正しく設定されているか確認する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#4 の「補足」についてです。 今調べて分かったのですが, d3dx9.lib ってインポートライブラリじゃなくて, 普通のスタティックライブラリなのね。-_-; よって,COFF2OMF では変換できません。 困りましたねぇ。 d3dx9.lib がらみの関数を使うのはあきらめるか, (それでも DirectX 自体は使えますから) Borland 用の DirectX の .lib を作って配布している方がいらっしゃるので, それを使うしかなさそうです。 "for C++ Builder" といってますが BCC でも使えるでしょう(未確認) http://clootie.narod.ru/cbuilder/index.html DirectX 8 用ですが日本語の説明つき http://www.ecoop.net/coop/translated/Borland/index.html # text3d.cpp に #include を追加されてますが,その必要はありません。 # 「外部シンボルが未解決」というのはリンク時のエラーです。 # ということは,コンパイル自体は成功しているということですから。
その他の回答 (4)
#3 の「補足」に関してです。 必要な .lib は,DirectX SDK のヘルプをみれば分かります。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/directx9_c/directx/graphics/reference/d3dx/functions/miscellaneous/d3dxcreatefont.asp
補足
ありがとうございます。 エラー6つをカバーするhファイルとlibファイルを調べ挙げ text3d.cppに #include <D3D9.h> //add //#include <D3Dx8shape.h> //add入れるとエラー #include <d3dx9core.h> //add #include <d3dx9math.h> //add を追加し コマンドを bcc32 -W -WM -VM -w- -Dsqrtf=sqrt -Dexpf=exp -Dasinf=asin -Dsinf=sin -Id:\dxsdk\include -Ic:\Borland\Bcc55\include -ID:\DXSDK\Samples\C++\Common\include -Lc:\Borland\Bcc55\lib -Lc:\Borland\Bcc55\lib\Psdk -etext3d.exe text3d.cpp dxutil.cpp d3denumeration.cpp d3dsettings.cpp d3dapp.cpp d3dfont.cpp d3dutil.cpp d3d9.lib d3dx9.lib D3dx8.lib にしましたが6つのエラーが一向に消えません。 (hファイルの1つだけは入れると重複定義エラーがいっぱい出てきたのでコメントにして入れませんでした。) 念のため d3dutil.cpp d3d9.lib d3dx9.lib D3dx8.lib をtext3d.cppのディレクトリに移動し確かにOMFで有ることを確認しました。 他に思い当たる原因は無いでしょうか?
#1 の「お礼」についてです。 DirectX の .lib をリンクしていないのでは? 'Direct3DCreate9' について調べれば,d3d9.lib が必要なことはすぐに分かりますから, こいつをリンクしてください。 BCC32 (省略) d3dutil.cpp d3d9.lib # あと,サンプルにはリソースが含まれてますから, # これもリンクしないといけないです。 #1 で, 「ソースファイル(.cpp)を一緒にコンパイル,リンクする必要があります。 」 と書きましたが,適切な表現ではありませんでした。 ソースファイルを別々にコンパイルして, 出来上がったオブジェクトファイルをリンクして1つにまとめても構いません。 むしろそうするのが普通です。 http://www.okweb.ne.jp/kotaeru.php3?q=689984 でも出てますが,複数のファイルをコンパイル,リンクしなければならないような場合, Makefile を作って make ツールを使うと便利です。 余裕があったらこちらも調べてみてください。
補足
ありがとうございます。 あれからいろいろやってみて bcc32 -W -WM -VM -w- -Dsqrtf=sqrt -Dexpf=exp -Dasinf=asin -Dsinf=sin -Id:\dxsdk\include -Ic:\Borland\Bcc55\include -ID:\DXSDK\Samples\C++\Common\include -Lc:\Borland\Bcc55\lib -Lc:\Borland\Bcc55\lib\Psdk -etext3d.exe text3d.cpp dxutil.cpp d3denumeration.cpp d3dsettings.cpp d3dapp.cpp d3dfont.cpp d3dutil.cpp d3d9.lib として text3d.cppに#include <D3D9.h> を追加し ラインコマンドにd3dutil.cpp d3d9.libを上のように追加すると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland text3d.cpp: dxutil.cpp: d3denumeration.cpp: d3dsettings.cpp: d3dapp.cpp: d3dfont.cpp: d3dutil.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'D3DXCreateFont' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXVec3Normalize' が未解決 (C:\_DXTEST\D3DUTIL.OBJ が参照) Error: 外部シンボル 'D3DXMatrixLookAtLH' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXMatrixPerspectiveFovLH' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXCreateTextA' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXMatrixRotationAxis' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) となりエラーが1個減りました。 ご指摘の方法でもやりましたが効果は同じで1個減ったきりで他のエラー6個が残ります。 他のクラスがどこに実装されているかgrepコマンドで調べまわったのですがソースレベルでは分かりませんでした。 実態を実装しているlibファイルをgrepで知ることはできないので困っています。 5つエラーで指摘されているクラスは d3dxmath.hと d3dx8math.hと d3dx9math.hで宣言だけされています。 あとは実装先が分かればいいのですが 分からなければlibすべてlinkしないといけないのでしょうか?
> COFF2OMF で変換 > はlibファイルをしらみつぶしに探し回ってすべてCoeff2omfしないといけないのでしょうか? c:\DXSDK\Lib に入っているのをすべて変換しておけばいいですが, とりあえず D3DXMatrixLookAtLH を使うのに必要な d3dx9.lib だけでもいいと思います。 > 変換したものを別のディレクトリに入れるとしてそれにパスを通しインストールのときにはいった > マイクロソフトのDirectXへパスをすべてはずさないといけないのでしょうか? そうですね, ライブラリのパスははずしといてください。
お礼
ありがとうございます。
補足
bcc32 -W -WM -VM -Dsqrtf=sqrt -Dexpf=exp -Dasinf=asin -Dsinf=sin -Id:\dxsdk\include -Ic:\Borland\Bcc55\include -ID:\DXSDK\Samples\C++\Common\include -Lc:\Borland\Bcc55\lib -Lc:\Borland\Bcc55\lib\Psdk -etxt3d.exe dxutil.cpp d3denumeration.cpp d3dsettings.cpp d3dapp.cpp d3dfont.cpp d3dutil.cpp を打ち込むとエラーがやっと1つになりました。 このエラーは Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照) ですが今までは-Wを入れ忘れると出てきたものですが今回は-Wををきちんと入れています。 どうしてエラーが出るのでしょうか?
DirectX のバージョンぐらいは書いて欲しいところですが。 おそらく最新版の 9.0なんとか だろうということで話を進めます。 まず, CD3DEnumeration, CD3DApplication, CD3DFont のメンバ関数が定義されているソースファイル(.cpp)を一緒にコンパイル,リンクする必要があります。 ソースファイルは, D:\DXSDK\Samples\C++\Common\Src にあるはずです。 次に,DirectX の DLL 用のインポートライブラリ(d3dx9.lib とか) をリンクする必要があります。 ただし,DirectX SDK に付属しているのは VC++ 用なので, COFF2OMF で変換するか,IMPLIB で作る必要があります。
お礼
すいません。書くところが無いのでここに書きます。 2の補足で入力ミスを確認して新たなエラーメッセージが出ました。 正しい入力は bcc32 -W -WM -VM -Dsqrtf=sqrt -Dexpf=exp -Dasinf=asin -Dsinf=sin -Id:\dxsdk\include -Ic:\Borland\Bcc55\include -ID:\DXSDK\Samples\C++\Common\include -Lc:\Borland\Bcc55\lib -Lc:\Borland\Bcc55\lib\Psdk -etext3d.exe text3d.cpp dxutil.cpp d3denumeration.cpp d3dsettings.cpp d3dapp.cpp d3dfont.cpp d3dutil.cpp>gomi.txt です。 -etext3d.exe text3d.cppのところが-etxt3d.exeとなっていました。 エラーメッセージは Error: 外部シンボル 'Direct3DCreate9' が未解決 (C:\_DXTEST\D3DAPP.OBJ が参照) Error: 外部シンボル 'D3DXCreateFont' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXVec3Normalize' が未解決 (C:\_DXTEST\D3DUTIL.OBJ が参照) Error: 外部シンボル 'D3DXMatrixLookAtLH' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXMatrixPerspectiveFovLH' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXCreateTextA' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) Error: 外部シンボル 'D3DXMatrixRotationAxis' が未解決 (C:\_DXTEST\TEXT3D.OBJ が参照) の7つです。 libファイルはすべてc:\boralnd\bcc55\lib\psdkにCoff2omfで移しました。 よろしくお願いします。
補足
ありがとうございます。 DirectXを昨日ダウンロードしたので最新版です。従来のもの(9)とアップデイト差分(9)をダウンロードしました。 DirectX SDK に付属しているのは VC++ 用なので, COFF2OMF で変換 はlibファイルをしらみつぶしに探し回ってすべてCoeff2omfしないといけないのでしょうか? 変換したものを別のディレクトリに入れるとしてそれにパスを通しインストールのときにはいったマイクロソフトのDirectXへパスをすべてはずさないといけないのでしょうか? よろしくお願いします。
お礼
補足の続きです。 DXD9.DLLとDXD9.LIBはパソコン内に存在しません。 DDRAW.DLLはWindows\Systemにあります。 (LIBはTEXT3D.EXEがあるディレクトリにあります。)
補足
ありがとうがざいます。 ご指摘のサイトからd3d9x.libをダウンしてボーランドのlibディレクトリに格納すれば 'D3DXCreateFont'だけがエラーとして残りました。 しかしこれはd3d9x.libが実装先です。 そこで同じサイトからD3dx8.libを格納したらリンクエラーは無くなりました。(?) が、Text3dを実行してみると プルグラム開始エラー:(これはタイトルバー) DXD9.DLLファイルは 欠落エクスボート DDRAW.DLL:DdEntry10にリンクされています。 という!マークアイコン付きのメッセージボックスが出てしまいます。 まことに恐縮ですが何が悪いのでしょうか?