環境はMinGWです。ただ、MinGWをインストールしたのがまだプログラミングを何も分からない時によく分からないままインストールしたままなので、余計なヘッダファイルやその他ライブラリがインストールされてしまったかもしれません。
DirectXプログラミングをしてみようと思ったのでDirectX9の本を買いました。その本の最初を読んで、「DirectX SDK (June 2010)」というのが必要なことを知り、それをダウンロードしました。さてまずはサンプルコードをコンパイルしてみようと思ったのですが、ここでこの質問の最初に書いた影響なのか、MinGWのincludeパスにはd3d9.h、libパスにはlibd3d9.a、libd3dx9d.aが「なぜか」あり、LPD3DXSPRITE型の動作がおかしい問題にしばらく悩まされました。この問題は、MinGWの方のDX関連のヘッダーを消し、DXSDKのヘッダーだけ使うことで解決しました。ここで、MinGWに入っているDX関連のファイルはダウンロードしたDXSDKと合わないのかな、と予想がつきます。考えてみれば合うほうがおかしいです。
しかし、リンクで少し問題が起こりました。例えば次のコード(test1.cpp)をコンパイルしたtest1.oをリンクする際、g++ -o test.o
ではもちろんリンクエラーが出ますが、g++ -o test.o -L "DXSDKのライブラリパス" -ld3d9 -ld3dx9d
でも同じリンクエラーが出ます。DXSDKのライブラリの拡張子は.libですが、リンクの際に"ファイルフォーマットがおかしい"などの警告は出ないのでMinGWもlibは使えるはずです。一方、MinGWに元からついていた(おそらくDXSDKとはバージョンが異なる)d3dx9d.aとd3d9.aをリンクするとリンクできます。しかしそれで生成したexeはDXSDKに入っていない"d3dx9d.dll"が必要になってしまいます。DXSDKに入っていたのは"d3dx9d_xx.dll"で、これでは実行できませんでした。
運良くというべきか、MinGWにもともとd3dx9d.aとd3d9.aがあったおかげでビルドすることはできますが、あまり気持ちよくはないです。DXSDKのみを使ってリンクしたいのですが、MinGWではできないとかなのでしょうか。それとも単純にリンクすべきライブラリがDXSDKではd3d9.libとd3dx9d.libではないのでしょうか。ためしに"lib2a"というツールを使ってDXSDKの.libを.aに変換してみましたが、変換する前と何も変わりません。
test1cpp
1#include <~~/DirectX(June 2010)/Include/d3dx9.h> 2int main(){ //これらの関数を使ったときにライブラリのリンクが必要だったので 3 Direct3DCreate9(0); 4 D3DXCreateTextureFromFile((LPDIRECT3DDEVICE9)0, (LPCSTR)0, (IDirect3DTexture9**)0); 5 D3DXCreateSprite((LPDIRECT3DDEVICE9)0, (ID3DXSprite**)0); 6 return 0; 7}
/
/
/
/
しかしもう一つ深刻な問題があります。それはDXSDKについてきたDXUTがコンパイルすら不可能ということです。
MinGWの.aをしかたなく使いながら本で勉強していると、DXUTを使う必要が出てきました。
"/./DirectX SDK (June 2010)/Include"にはDXUT.hは無かったのでファイル検索してみると、"/./DirectX SDK (June 2010)/Sample/c++/DXUT/core/"にありました。そのためこの場所を指定して、test.cppを次のようにコンパイルを試みました。
testcpp
1#include <DXUT.h> 2#include <d3dx9.h> //これをインクルードしないとコンパイルエラーメッセージの最初にWINVERのエラーが出るので一応 3int main(){return 0;}
compile
1//unicode ビルドしろと言われたので-DUNICODE 2g++ -c test.cpp -I "/./DirectX SDK (June 2010)/Include" -I "/./DirectX SDK (June 2010)/Sample/c++/DXUT/core/" -DUNICODE
するとおびただしい行のエラーが出力されました。ほとんど同じ識別子の未定義エラーなのでところどころ省略して大幅に短くしました。それでも長いですが次のような感じです。
ErrorMessage
1 + CategoryInfo : NotSpecified: (In file include...010)/DXUT.h:88,:String) [], 2 RemoteException 3 + FullyQualifiedErrorId : NativeCommandError 4 5 from .\test.cpp:3: 6C:\~\Microsoft DirectX SDK (June 2010)\Include/dxgi.h:286:13: error: '__in' has not be 7en declared 8 __in REFGUID Name, 9 ^~~~ 10 11In file included from ~\mingw\include\rpcdce.h:10, 12 /~~省略~~/ 13 from ~\Microsoft DirectX SDK (June 2010)\Include/d3d9.h:40, 14 from .\test.cpp:1: 15~\Microsoft DirectX SDK (June 2010)\Include/dxgi.h:286:19: error: expected ',' or ' 16...' before '&' token 17 __in REFGUID Name, 18 ^~~~~~~ 19/~~省略~~/ 20In file included from C:/~~/DXUT.h:88, 21 from .\test.cpp:3: 22C:\~\Microsoft DirectX SDK (June 2010)\Include/dxgi.h:554:13: error: '__out' has not b 23een declared 24 __out HANDLE *pSharedHandle) = 0; 25 ^~~~~ 26 27C:\~\Microsoft DirectX SDK (June 2010)\Include/dxgi.h:554:27: error: expected ',' or ' 28...' before '*' token 29 __out HANDLE *pSharedHandle) = 0; 30 ^ 31 32C:\~\Microsoft DirectX SDK (June 2010)\Include/dxgi.h:558:13: error: '__out' has not b 33een declared 34 __out DXGI_USAGE *pUsage) = 0; 35 ^~~~~ 36/~~省略~~/ 37C:\~\Microsoft DirectX SDK (June 2010)\Include/d3d10.h:4912:25: error: conflicting dec 38laration 'int NumViews' 39 __in_ecount(NumViews) ID3D10ShaderResourceView *const *ppShaderResourceViews) 40= 0; 41 ~~~~~~~~~~~~^~~~~~~~~ 42 43C:\~\Microsoft DirectX SDK (June 2010)\Include/d3d10.h:4910:93: note: previous declara 44tion as 'UINT NumViews' 45 __in_range( 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot ) UINT 46 NumViews, 47 ~~~~ 48~^~~~~~~~ 49 50/~~省略~~/ 51C:/~/DXUTmisc.h:379:5: note: in expansion of macro 'DXUT_BeginPerfEve 52nt' 53 DXUT_BeginPerfEvent( color, pstrMessage ); 54 ^~~~~~~~~~~~~~~~~~~ 55 56C:/~/DXUTmisc.h: In destructor 'CDXUTPerfEventGenerator::~CDXUTPerfEv 57entGenerator()': 58C:/~/DXUTmisc.h:363:54: error: '__noop' was not declared in this scop 59e 60 #define DXUT_EndPerfEvent() (__noop) 61 ^~~~~~ 62C:/~/DXUTmisc.h:383:5: note: in expansion of macro 'DXUT_EndPerfEvent 63' 64 DXUT_EndPerfEvent(); 65 ^~~~~~~~~~~~~~~~~
9割が_._in, _._outが未定義というのと"expected ',' or '...' before '*' token"のエラーですが、細かく見るとそれ以外もありました。なにかインクルードするファイルが足りないのでしょうか? それともDirectX SDKはvisual studioでしか使えないとかそういうことですか?もう手詰まりです。
/
/
/
問題を整理すると、"DXSDK付属の.libをリンクしても何もリンクしないのと変わらないこと"と"DXUTがつかえないこと"です。
長くなりましたがよろしくお願いします。
/
/
/
/
追記 ※大きな問題は諦めたので解決済 2019/10/22
一つ目の問題、DXSDK付属の.libファイルをリンクしてもしないのと同じようになるということについて、x64用とx86のディレクトリの中にそれぞれ.libファイル軍があったのですが、x86の方のライブラリを使ったら正常にリンクできました。ただ依然として生成されたexeは無印d3dx9d.dllを必要とします。DXSDK内のヘッダーと.libで生成したexeであるにもかかわらず、exe実行時に要求されるdllがDXSDK付属のd3dx9d_33.dllとd3dx9d_44.dllのどちらかではないのはなぜなのかと思います。とはいえDXUTを使わないDirectXプログラミングはMinGWでも可能だと分かりました。
visual studioでないとDXUTは使えないとのことなのでVScomunityをインストールし、さっそくtest.cppをコンパイルしてみましたが、windows sdkのwinerror.hとDXSDKのdxgitype.h, d3d10.hでdefineの重複がありました。しかしobjファイルは生成され、それはリンク可能でした。この定義重複は無視していいものなのか分かりませんが、とりあえず目的は達成できました。
DXUTを使うため仕方なくvisual studioに乗り換えようと思いますが、(調べた限りなかったのでないと思いますが)もしDXUT for MinGWみたいなものがこれから出てきたら教えてください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。