プロが教えるわが家の防犯対策術!

(ダウンロードしたWindowsのSDK内のもの)
をtext3d.cppをコンパイルすると
(bcc32 -W c:\DXSDK\Samples\C++\Direct3D\Text3D)
Error:
外部シンボル'CD3DEnumeration::~CD3DEnumeration()' が未解決
等未解決表示の
CD3DEnumerationのメンバ関連のエラー1個
CD3DApplicationのメンバ関連のエラー7個
CD3DFontのメンバ関連のエラー9個
D3DXMatrixLookAtLHのメンバ関連のエラー1個
が出てきます。
未解決表示のエラーはどうして出てくるのでしょうか?
これらのエラーをなくすにはどうしたらいいでしょうか?

A 回答 (5件)

DirectX のバージョンぐらいは書いて欲しいところですが。


おそらく最新版の 9.0なんとか だろうということで話を進めます。

まず,
CD3DEnumeration, CD3DApplication, CD3DFont のメンバ関数が定義されているソースファイル(.cpp)を一緒にコンパイル,リンクする必要があります。

ソースファイルは,
D:\DXSDK\Samples\C++\Common\Src
にあるはずです。

次に,DirectX の DLL 用のインポートライブラリ(d3dx9.lib とか) をリンクする必要があります。
ただし,DirectX SDK に付属しているのは VC++ 用なので,
COFF2OMF で変換するか,IMPLIB で作る必要があります。

参考URL:http://wata.da-shi.org/directx/chapter2.html

この回答への補足

ありがとうございます。

DirectXを昨日ダウンロードしたので最新版です。従来のもの(9)とアップデイト差分(9)をダウンロードしました。


DirectX SDK に付属しているのは VC++ 用なので,
COFF2OMF で変換
はlibファイルをしらみつぶしに探し回ってすべてCoeff2omfしないといけないのでしょうか?
変換したものを別のディレクトリに入れるとしてそれにパスを通しインストールのときにはいったマイクロソフトのDirectXへパスをすべてはずさないといけないのでしょうか?

よろしくお願いします。

補足日時:2003/10/26 21:37
    • good
    • 0
この回答へのお礼

すいません。書くところが無いのでここに書きます。
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で移しました。
よろしくお願いします。

お礼日時:2003/10/27 17:29

> 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ををきちんと入れています。
どうしてエラーが出るのでしょうか?

補足日時:2003/10/27 15:59
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2003/10/26 22:58

#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しないといけないのでしょうか?

補足日時:2003/10/27 23:56
    • good
    • 0

#3 の「補足」に関してです。



必要な .lib は,DirectX SDK のヘルプをみれば分かります。

http://www.microsoft.com/japan/msdn/library/defa …

この回答への補足

ありがとうございます。

エラー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で有ることを確認しました。

他に思い当たる原因は無いでしょうか?

補足日時:2003/10/28 02:52
    • good
    • 0

#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/ind …

# text3d.cpp に #include を追加されてますが,その必要はありません。
# 「外部シンボルが未解決」というのはリンク時のエラーです。
# ということは,コンパイル自体は成功しているということですから。

この回答への補足

ありがとうがざいます。

ご指摘のサイトからd3d9x.libをダウンしてボーランドのlibディレクトリに格納すれば
'D3DXCreateFont'だけがエラーとして残りました。
しかしこれはd3d9x.libが実装先です。
そこで同じサイトからD3dx8.libを格納したらリンクエラーは無くなりました。(?)
が、Text3dを実行してみると

プルグラム開始エラー:(これはタイトルバー)
DXD9.DLLファイルは
欠落エクスボート
DDRAW.DLL:DdEntry10にリンクされています。

という!マークアイコン付きのメッセージボックスが出てしまいます。

まことに恐縮ですが何が悪いのでしょうか?

補足日時:2003/10/28 14:16
    • good
    • 0
この回答へのお礼

補足の続きです。
DXD9.DLLとDXD9.LIBはパソコン内に存在しません。
DDRAW.DLLはWindows\Systemにあります。
(LIBはTEXT3D.EXEがあるディレクトリにあります。)

お礼日時:2003/10/28 14:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!