こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

「マクロが再定義されました」と「C1083: include ファイルを開けません。」のエラー

少しここで質問してもいいのか不安ですが、助言お願いします。プログラミングについてはまったくの初心者です。(C言語見だして十日程度)
環境はXP, Microsoft Visual C++08, DirectX SDK(November 2008)です。

"0からのゲームプログラミング"と言うサイトに沿って勉強してるのですが、
上記サイト:http://www.plustarnet.com/aspil/Programming/
上記サイトコンテンツの、2D編の"スケルトンプログラム"の項目でスケルトンプログラムをダウンロードし、記事の通りに作成したのですが、次のようなエラーがでます。

c:\documents and settings\USER\my documents\visual studio 2008\projects\samplestg\skeleton\win32\header\stdafx.h(27) : warning C4005: 'UNICODE' : マクロが再定義されました。コマンド ラインの引数 : 'UNICODE' の前の定義を確認してください
c:\documents and settings\USER\my documents\visual studio 2008\projects\samplestg\skeleton\header\music.h(18) : fatal error C1083: include ファイルを開けません。'dmusici.h': No such file or directory
エラー 4、警告 4
ソースファイルにある4つの.cppそれぞれで出ます。

(1).定義云々と言われる方は(こちらは警告)
//#defineUNICODE// UNICODE を使用
#ifdefUNICODE
#define_UNICODE  ←ここ
#endif
ここです。MSDNのヘルプを見ると、削除または#undefを使え、だったので、#ifdefと#defineの間に"#undef _UNICODE"を追加した所通りました。(削除でも通りました)
ただ、これでその後プログラムしていくのに変えて大丈夫でしょうか?

(2).includeエラーの方は、(こちらがエラー)
#include<dmusici.h>
となってるのですが、"dmusici.h"と言うのは"windows.h"などと一緒(ライブラリ?SDK?依存)の物でしょうか?
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
C:\Program Files\Microsoft DirectX SDK (November 2008)\Include
とVC++08にセットアップ(?)してますが、どちらにも"dmusici.h"はありませんでした。これはこちらのSDKの問題でしょうか?

(1)は、一応解決済みで、警告はでないのですが、もし他にいい方法があれば教えてほしいです。
(2)は、自分的にはDirectX SDKあたりだと思うのですが、良く分かってません…
そもそも上記サイトでの解説が04年時の物で、"Visual C++ 6.0"と"DirectX 9.0 SDK Update (Summer 2003)"でのプログラムと解説なので、今のDirectX SDK (November 2008)で動作出来ない(このエラーが解決してもその後そぐわなくなる)ものなのでしょうか?そのあたりも教えていただきたいです。
かなり長文になってしまいました^^;。失礼しました。

投稿日時 - 2009-09-26 23:40:39

QNo.5321625

すぐに回答ほしいです

質問者が選んだベストアンサー

※お使いの環境はVC++6.0ではなくVC++08でしたね。すいません勘違い
してました。

VC++2008ExpressEdition, DirectX SDK(August2007), DirectX SDK
(November2008)で同じコンパイルエラーが再現できたようなので
ちょっと調べてみました。

(3)について
コンパイラの仕様変更による問題のようです。
http://msdn.microsoft.com/ja-jp/library/y81x4ttb(VS.80).aspx
仕様ということなのでソースを修正する他無さそうです。
上記サイトの例のようにdllmain.h内を修正することになります(「=
ホニャララ」の部分を消す)。

(4)について
SkeletonDll::CFilePack::Beginメソッドの引数がLPCTSTR型なのに対し
て、コール側が普通の文字列リテラルを与えている為に出ているエラー
のようです。
(Microsoft SDKsフォルダ内のヘッダファイルを見たところ)LPCTSTR型
はワイド文字定数のポインタ型でした。
要するにメソッド側がワイドなのに対してコール側がワイドでないとこ
ろが問題なので、コール側をワイド文字列に修正する必要があります。
具体的にはBegin("mojiretsu");のようになっている箇所で、
Begin(L"mojiretsu");のように先頭にLをつければ良いです。

投稿日時 - 2009-09-28 05:34:52

補足

返事遅くなりました。すみません。
大変分かりやすい回答ありがとうございます。おかげで(3),(4)とエラーは解決しました。
でもまた、別のエラーが出てきました…
リンカエラーだったんですが、どうやらVC++08自体?でダメなようで、まずエラーが

(メイン.cpp名).obj : error LNK2019: 未解決の外部シンボル~が関数~で参照されました。
MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル~が関数~で参照されました。
これが数十種類。~が関数~と略してる~の部分が重要なんでしょうが、多すぎて一例にどれを取ればいいやら…
最後に
C:(略)\SampleSTG.exe : fatal error LNK1120: 外部参照 45 が未解決です。

で、VC++08でWindowsアプリケーション(46)の新規作成での初期コードのビルドでもMSVCRTD.libと(メイン.cpp名).objの、リンカエラーが出されます。コンソールアプリケーション(26)やCLRコンソールアプリケーション(15)でもMSVCRTD.libのエラー同様でした。(アプリの()内の数字は最後に出てくる外部参照~が未解決、での数字です。なんとなく)
プロジェクトのプロパティのリンカあたりもいじってみましたがダメでした。
printfでHello Worldすら出来ない状態に…

正直面食らってよく頭が…VC++08の問題なら、元の質問から離れそうっぽいのですね…

投稿日時 - 2009-09-29 00:23:19

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

ほとんど情報量 0 ですが:
とりあえず, 「メイン」の方で出ているエラーは挙げてもらえると「多少は何とかなる」かもしれません. 一方, MSVCRTD.lib で出ているエラーは「何かライブラリをリンクし忘れている」のかもしれません.
とにかくそのサイトの情報は古いので, 最近の環境を使うほどエラーになりやすいとは思います.

投稿日時 - 2009-09-29 11:45:58

補足

すみません。補足投稿前に更新見忘れてました。反省…

1個前の補足通りです。
実際は、"すべての設定のリセット"でリセットしたら直りました。ライブラリに、あるlibファイルを入れるとエラーが再現されるので、それが原因のようでした。(素人の目ですが)
(メイン.cpp名).objのエラーもリセットで直りました。リセットによってlibとは関係なく他の事で解決されたのかも知れませんが。

>そのサイトの情報は古いので, 最近の環境を使うほどエラーになりやすいとは思います
そうなってしまうものなのですね…手厳しいものです。
 
1個前の補足通りです。今回は諦めます。ありがとうございました。

投稿日時 - 2009-09-29 12:39:02

ANo.3

開発環境に依存した問題は大概厄介です^^;
もし自分なら(3)が出て来たあたりで見切りを付けてると思います。
解決に至ることができず恐縮千万です。

投稿日時 - 2009-09-29 05:39:54

補足

いえ、ご助言分かりやすくて有り難いです。
今回自分の力及ばずで、何度も質問してしまって…

結果的に.libのエラーはディレクトリを表示するプロジェクトのライブラリファイルに色々詰め込みすぎたみたいでした。数個外すと無事通りました。
スケルトンプログラムは、おかげでビルドは通ったのですが、デバッグ時に別のエラーが出てきました…

>開発環境に依存した問題は大概厄介です^^;
>もし自分なら(3)が出て来たあたりで見切りを付けてると思います。
いやまったくです。今回は諦めて、またDirectX SDKの勉強は新しい記事、書籍でアプローチしてみようと思います。(そういう問題なのか自分でもちょっと疑問ですが)

kettachinさん今回はありがとうございました。

投稿日時 - 2009-09-29 12:35:40

ANo.1

(1)について
C言語ではマクロは#define以外にコンパイル時のオプションで
定義することも可能です。
Visual C++ 6.0を持っていないのでこちらで確認が取れず申し訳
無いのですが、下記のURLを参考にコンパイルオプションに
/D UNICODE が定義されていないか調べてみてはいかがでしょうか。
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/setting.html#マクロ定義

また、UNICODEと_UNICODEでは意味合いが多少異なるようです。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200711/07110005.txt
憶測ですがスケルトンプログラムに_Tマクロが使用されている場合、
動作が変わるかもしれません。

(2)について
お察しの通りSDKの問題のようです。
http://cgi32.plala.or.jp/higpen/book/shtPro/qa.shtml#compile6

以上ご参考になれば幸いです。

投稿日時 - 2009-09-27 00:59:34

補足

お早い回答ありがとうございました。

色々といじった結果、逆に悪化させてしまったようで…
(2)は、まずURL大変参考になりました。最新のverでは無いのですね。
プログラムの変更は到底無理なので、とりあえずDirectX SDK August 2007にver落としてみようと、
November 2008をアンインストールし(これがまずかった?)August 2007をインストールしてビルドした所dmusici.hの問題は解決しました。が、別のエラーが出るようになりました。

(3)error C2383: 既定の引数をこのシンボルで使用できません。

(4)error C2664: 'SkeletonDll::CFilePack::Begin' : 1 番目の引数を 'const char [15]' から 'LPCTSTR' に変換できません。(新しい機能 ; ヘルプを参照)指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

どちらもどういうエラーなのか大体は分かるのですが、なぜこのようなエラーが出てきたのかよく分かりません。
SDKの方をいじってるので、SDKの問題なのかとは思うのですが、自分の解読力がないので… 
一応現在August 2007とNovember 2008の両方入ってます。(08を消して07を入れ再度08を入れた)

(3)の方はファイル名はDllMain.hで、処理内容はDLL作成みたいで、関数の型定義がズラッと並んでいます。その中のエラーです。
(4)の方はサッパリです。

(1)はUNICODEは作者固有の物だと勝手に思ってましたが、規定の文字のデータ型(?)だったんですね。調べてみると結構議論されててややこしいですね…。多少理解できましたが扱うのは無理そうなので、#undefで様子見としました。上記のエラーも出てきたので…

(1),(2)は(一時?)解決しました。ありがとうございます。
(3),(4)はどのように解決すればいいのか分かりません。助言お願いしたいです。

長文、駄文失礼しました。

投稿日時 - 2009-09-27 15:09:14

あなたにオススメの質問