win2000 MFC VC++6.0
皆さんにお聞きしたいのですが、
デバッグモードでビルドして、できた実行ファイルはうまく動くのですが、
リリースモードでビルドして、できた実行ファイルはエラーがでてきます。
メモリがreadになることはできませんでしたと出ます。(ダイナミックリンクの場合)
スタティックリンクの場合は逆で、
デバッグモードでは、エラーがでるのですが、
リリースモードでは、ビルドでエラーはでません。
しかし、ファイルへの出力結果がおかしくなります。
0に1を加えて1にしたいのに、4とか期待はずれの結果となります。
デバッグモードやリリースモード、ダイナミックやスタティックリンクを変更すると、
なぜ、エラーが出てきたり、実行結果が変わったりするのでしょうか。
a.) 本来問題がある行為を行っているが,たまたまデバッグモード(or リリースモード)で動いている
b.) リリースモードの最適化の結果間違ったコードをコンパイラが吐きだした
のどちらかです。
まずはa.を疑ってみるのがよいでしょう。
デバッグ時にのみ実行可能となるTRACE文の中に実際必要としているコーディングをして
しまっているとか。リリースビルド時にはそっくり消えてしまう。
こん!<=^・^=>
.libと.dllでバージョンが一致していない、とか。
初期化してない変数の値に依存した部分がある、とか。
> 0に1を加えて1にしたいのに、4とか期待はずれの結果となります。
この問題は
> 初期化してない変数の値に依存した部分がある、とか。
で解決できました。
ひとつ質問ですが、ビルドを行うとDebugやReleaseのフォルダが作成されますが、
その中に、exeの実行ファイルと.objや.idbなどの中間ファイルもあります。
これはビルドが正常に終了していないためでしょうか。
それとも、中間ファイルはフォルダ内に残ったままになるのでしょうか。
残ります。
じゃないと次にビルドする時にまた全てコンパイルしなければならなくなってしまうのでは?
こん!<=^・^=>
warning LNK4098: defaultlib MSVCRT は他のライブラリの使用と競合しています;
/NODEFAULTLIB:library を使用してください
というようなエラーがでましたが、意味がわかりません。
どういうことなのでしょうか。
ライブラリを変更しろってことですか。
デバッグモードやリリースモード、ダイナミックやスタティックリンクを変更すると、
エラーがでるのは、このせいでしょうか。
> warning LNK4098: defaultlib MSVCRT は他のライブラリの使用と競合しています;
> /NODEFAULTLIB:library を使用してください
> というようなエラーがでましたが、意味がわかりません。
> どういうことなのでしょうか。
取り敢えずエラーじゃないですね。ワーニングです。
MSDNでLNK4098を検索して読んでみましょう。
こん!<=^・^=>
標準のライブラリ以外のライブラリを使っているときは,
作成したライブラリに使用するCRTを合わせる必要が出てきます。
> /NODEFAULTLIB:library を使用してください
これは単なる対処療法ですから,根本から設定を変更した方がよいです。
> これは単なる対処療法ですから,根本から設定を変更した方がよいです。
確かにその通りなのですがね。muaさんはいろいろ設定をいじりたおして何かを試している様
ですが結局何をされているのでしょうか?そろそろプロジェクトの内容を明かしていただけると
皆さん幸せになれるかなと思うのですが?
こん!<=^・^=>
> デバッグモードやリリースモード、ダイナミックやスタティックリンクを変更すると、
> なぜ、エラーが出てきたり、実行結果が変わったりするのでしょうか。
いろいろ試してみましたところ、ソースに根本的なエラーがありました。
ビルドをしたときはエラー数は0で、教えてもらえませんでした。
デバッグしたときに、エラーを発見できました。
あと、警告レベルを4にして、警告を全て対処いたしましたところ、
デバッグモードやリリースモード、ダイナミックやスタティックリンクに関係なく、
実行ファイルを無事に実行することができました。
アドバイスくださった皆様には、感謝いたします。
> いろいろ試してみましたところ、ソースに根本的なエラーがありました。
出来ましたらその具体的な内容も教えていただけると後々同じ状況になった方の道標となれる
かも。
こん!<=^・^=>