none
Visual Studio でWin32プログラムをリリースするための設定方法 RRS feed

  • 質問

  • こんにちは。

    共通フォーラムに書き込んだところC++に書き込むのが正しいとのご指摘をいただいたため

    こちらにて再度質問をさせていただきたいと思います。

    この度は、VisualStudioを使用して作成したプログラムを友人にも使用してもらおうと思い、

    書き出そうと思ったところ、どうにもうまくいかなかったために質問をさせていただきました。

    ---------------環境------------------
    Visual Studio 2010 professional
    DirectX10
    プラットフォーム:アクティブ(Win32)

    構成:デバッグ(のとき)
    構成プロパティ > C/C++ > コード生成 > ランタイムライブラリ:マルチスレッドデバッグ

    構成:リリース(のとき)
    構成プロパティ > C/C++ > コード生成 > ランタイムライブラリ:マルチスレッド

    *この設定のときリリースでビルドしようとすると下記のエラーが発生*
    エラー 1 error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 D:\学習\プログラミング C++ DirectX \DirectX練習\脱出ゲー\DRAW_OBJECT.obj
    エラー 2 error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 D:\学習\プログラミング C++ DirectX \DirectX練習\脱出ゲー\libcpmtd.lib(stdthrow.obj)
    エラー 3 error LNK1120: 外部参照 1 が未解決です。 D:\学習\プログラミング C++ DirectX \DirectX練習\脱出ゲー\Release\脱出ゲー.exe


    リリースモードで書き出す設定とはどのようにしたら良いのでしょうか?

    やりたいことは「自分以外のPCで使用できるEXEファイルとして書き出す」ことです。

    素人ですので「根本的にやり方が違う」とか「やりたいことと、やってることが違う」などのご指摘があればそれもお願いします。

    足りない情報があれば、指摘していただければ補足いたします。
    何卒よろしくお願いします。


    2013年12月25日 7:33

すべての返信

  • _CrtDbgReportW()のドキュメントには

    C ランタイム ライブラリのデバッグ バージョンのみ。

    と記載されています。これはより厳密には定義されている crtdbg.h を参照すればわかりますが、_DEBUG が定義されているかどうかで分岐されています。

    プロジェクトのプロパティのプリプロセッサ定義の個所でリリースモードにおいても _DEBUG を指定していませんか?
    # 既定では紛らわしいですが、デバッグモード _DEBUG / リリースモード NDEBUG がそれぞれ定義されています。同一だと思ってデバッグモードの値をコピーしてしまうとこの現象に陥ります。

    2013年12月25日 7:57
  • ご返信有難うございます。

    デバッグモードのプリプロセッサ定義は

    WIN32
    _DEBUG
    _WINDOWS

    *継承の値↓*

    WIN32
    _DEBUG
    _WINDOWS
    K_PLUGIN
    K_NODLL
    _CRT_SECURE_NO_DEPRECATE
    KARCH_ENV_WIN32
    _UNICODE
    UNICODE

    リリースモードでは

    WIN32
    NDEBUG
    _WINDOWS

    *継承の値↓*

    WIN32
    _DEBUG
    _WINDOWS
    K_PLUGIN
    K_NODLL
    _CRT_SECURE_NO_DEPRECATE
    KARCH_ENV_WIN32
    _UNICODE
    UNICODE

    となっていることを確認いたしました。

    つまり、リリースモードの継承の値に「_DEBUG」と入っているのがこの原因ということでしょうか?

    2013年12月25日 8:24
  • 「KARCH_ENV_WIN32」って、FBX か何か使っているのでしょうか?

    継承される設定に "_DEBUG" が入ってしまっているのが問題なのでどこから継承されているかを突き止めないといけません。
    表示 - その他のウィンドウ - プロパティマネージャー から開くペインで Release の方の項目をそれぞれ確認し、どこで登録されているかを見つけてください。

    2013年12月25日 13:49
    モデレータ
  • >「KARCH_ENV_WIN32」って、FBX か何か使っているのでしょうか?

    これは、スタティックメッシュの関係でFBX SDKを入れようとした名残で残ってしまっている物ですね。

    結局使用しませんでしたが。。。

    今の今まで放置したままでした。

    継承される値の方ですが、

    プロパティマネージャ→Release→Microsoft.Cpp.Win32.user にて

    プリプロセッサの定義

    WIN32
    _DEBUG
    _WINDOWS
    K_PLUGIN
    K_NODLL
    _CRT_SECURE_NO_DEPRECATE
    KARCH_ENV_WIN32

    *継承の値*

    _UNICODE
    UNICODE

    となっているのを確認いたしました。

    これはどのように対処すればよろしいのでしょうか?

    2013年12月26日 13:10
  • 手元の Microsoft.Cpp.Win32.user によると「空」が正しいようです。
    すでに定義されている _DEBUG などを消して OK を押せば改善すると思います。

    ※スクリーンショットで継承された値に _AFXDLL が出ていますが、これはプロジェクトの種類が違うために出ているので、この違いを気にする必要はありません。
    2013年12月26日 15:37
    モデレータ
  • 原因は私が書きました。対策はAzuleanさんが書かれています。

    そこで質問なのですが、どのような操作をしてこのようなプロジェクトファイルが出来上がってしまったのでしょうか? どこかのサイトまたは書籍に記載があったとか、配布されているプロジェクトファイルが元々そうなっていたのか、その辺りをぜひ教えてください。

    2013年12月27日 0:18
  • Azulean様、佐祐理様、ご回答有難うございます。

    Azulean様、

    さっそく、そのスクリーンショットのように空にしてやってみようと思います。

    佐祐理様、

    素人なので正直「いつの間にかなっていた」が回答になってしまいそうで申し訳ないのですが、

    おそらく、DirectX SDKの設定やFBX SDKを使えるように設定するときに「管理者として実行」でVisualStudioを使用して

    プロパティをいじっていたせいかな?と考えております。

    わたしは、この設定に関して使用したサイトはFBX SDKがなかなかうまくいかなかったために手当たり次第サイトの情報をうのみにして試してみていました。

    使用している書籍はMESH GURUwithDirect3D10/11とDirectX10/11プログラミングというものです。

    プロジェクトファイルとしては、空のプロジェクトから作成を始めた自作のファイルでした。

    お二方の丁寧なご回答、本当にありがとうございました。

    2013年12月27日 2:39