- ベストアンサー
「マクロが再定義されました」と「C1083: include ファイルを開けません。」のエラー
- マクロ再定義とincludeファイル開けないエラーについての質問です。
- 質問者はプログラミング初心者で、C言語を10日間勉強しています。
- 質問者は「0からのゲームプログラミング」というサイトを参考にしており、スケルトンプログラムを作成した際にエラーが発生しました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
※お使いの環境は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をつければ良いです。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
ほとんど情報量 0 ですが: とりあえず, 「メイン」の方で出ているエラーは挙げてもらえると「多少は何とかなる」かもしれません. 一方, MSVCRTD.lib で出ているエラーは「何かライブラリをリンクし忘れている」のかもしれません. とにかくそのサイトの情報は古いので, 最近の環境を使うほどエラーになりやすいとは思います.
補足
すみません。補足投稿前に更新見忘れてました。反省… 1個前の補足通りです。 実際は、"すべての設定のリセット"でリセットしたら直りました。ライブラリに、あるlibファイルを入れるとエラーが再現されるので、それが原因のようでした。(素人の目ですが) (メイン.cpp名).objのエラーもリセットで直りました。リセットによってlibとは関係なく他の事で解決されたのかも知れませんが。 >そのサイトの情報は古いので, 最近の環境を使うほどエラーになりやすいとは思います そうなってしまうものなのですね…手厳しいものです。 1個前の補足通りです。今回は諦めます。ありがとうございました。
- kettachin
- ベストアンサー率40% (2/5)
開発環境に依存した問題は大概厄介です^^; もし自分なら(3)が出て来たあたりで見切りを付けてると思います。 解決に至ることができず恐縮千万です。
補足
いえ、ご助言分かりやすくて有り難いです。 今回自分の力及ばずで、何度も質問してしまって… 結果的に.libのエラーはディレクトリを表示するプロジェクトのライブラリファイルに色々詰め込みすぎたみたいでした。数個外すと無事通りました。 スケルトンプログラムは、おかげでビルドは通ったのですが、デバッグ時に別のエラーが出てきました… >開発環境に依存した問題は大概厄介です^^; >もし自分なら(3)が出て来たあたりで見切りを付けてると思います。 いやまったくです。今回は諦めて、またDirectX SDKの勉強は新しい記事、書籍でアプローチしてみようと思います。(そういう問題なのか自分でもちょっと疑問ですが) kettachinさん今回はありがとうございました。
- kettachin
- ベストアンサー率40% (2/5)
(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 以上ご参考になれば幸いです。
補足
お早い回答ありがとうございました。 色々といじった結果、逆に悪化させてしまったようで… (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)はどのように解決すればいいのか分かりません。助言お願いしたいです。 長文、駄文失礼しました。
補足
返事遅くなりました。すみません。 大変分かりやすい回答ありがとうございます。おかげで(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の問題なら、元の質問から離れそうっぽいのですね…