🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

2688閲覧

DirectX開発で必要なライブラリは本当に全て"DirectX SDK (June 2010)"に入っているのか

tometome

総合スコア27

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2019/10/22 05:14

編集2019/10/22 10:58

環境は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みたいなものがこれから出てきたら教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DirectX SDKはvisual studioでしか使えないとかそういうことですか?

これだと思います。SDKは恐らく以下からダウンロードされたと推察しますが、
Microsoft Download Center - DirectX Software Development Kit
※Ver. 9.29.1962, DXSDK_Jun10.exe, Date Published: 6/7/2010

このページの「Additional Information」に、以下の記述があります。

Visual Studio 2010 Support

The June 2010 DirectX SDK includes support for Visual Studio 2010. The DirectX SDK will continue to support Visual Studio 2008 as well. However, Visual Studio 2005 will no longer be supported.

リンクするライブラリはコンパイラ/リンカーに依存しますので、お使いのMinGWでは対応できないのだと思います。

投稿2019/10/22 06:10

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問