トップページ > 記事閲覧
WinMain関数が既に定義されていると表示され、実行されない
名前:DXライブラリ2日目でぶごん 日時: 2021/10/11 18:23

VScodeで、プロジェクト->新しい項目の追加を二回すると、デバッグをしたときに ビルドを開始しました... 1>------ ビルド開始: プロジェクト: 絵を動かす3, 構成: Debug Win32 ------ 1>絵を動かす(関数使用).cpp 1>絵を動かす3.obj : error LNK2005: _WinMain@16 は既に 絵を動かす(関数使用).obj で定義されています。 1>C:\Users\wildn\OneDrive\ドキュメント\DXライブラリ\練習\絵を動かす\絵を動かす3\Debug\絵を動かす3.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 1>プロジェクト "絵を動かす3.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== というメッセージが表示され、実行できません。 毎回新しいプロジェクトを作成しプロジェクトの設定をするのは面倒で大変なので、同じプロジェクト内でいくつかのコードを実行することができるようにするにはどうすればいいでしょうか。
メンテ

Page: 1 |

Re: WinMain関数が既に定義されていると表示され、実行されない ( No.1 )
名前:たろ 日時:2021/10/11 22:52

マクロを使用するというのはどうでしょうか? #define RUN_PROGRAM_NUM 0 #if RUN_PROGRAM_NUM == 0 //0でなければ無効(上のdefine文であれば有効) #endif #if RUN_PROGRAM_NUM == 1 //1でなければ無効 #endif 上のようにすれば、RUN_PROGRAM_NUMの値に応じてビルドするプログラムを変化させることができます。 コメントアウト部分にそれぞれWinMain関数があれば、RUN_PROGRAM_NUMの値に応じてメイン関数が変化する、といった具合になります。 他の解決策としては、同じソリューション内に複数のプロジェクトを作ることができます。 こちらは毎回プロジェクトの設定をする点は変わりありませんが、ソリューションを開き直す手間を省くことができます。
メンテ
Re: WinMain関数が既に定義されていると表示され、実行されない ( No.2 )
名前:管理人 日時:2021/10/12 04:15

私は一つのソースファイルの中に #if 〜 #endif のプリプロセッサ機能を使用して 幾つも WinMain を書いています( テスト用プログラムなど ) ただ、たろさんご提案の記述ほど丁寧ではなくて、 実行したいプログラムのみ #if 1 〜 #endif で囲んでプログラムを有効にして、 実行したくないプログラムは #if 0 〜 #endif で囲みプログラムを無効にするという適当な対処をしています (・・; <例> // 実行したくないプログラムなので #if 0 〜 #endif で囲む #if 0 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) return -1 ; DxLib_End() ; return 0 ; } #endif // 実行したいプログラムは #if 1 〜 #endif で囲む #if 1 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) return -1 ; DrawBox( 0, 0, 640, 480, GetColor( 255,255,255 ), TRUE ); WaitKey(); DxLib_End() ; return 0 ; } #endif // これも実行したくないプログラムなので #if 0 〜 #endif で囲む #if 0 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) return -1 ; DrawPixel( 320, 240, GetColor( 255,255,255 ) ); WaitKey(); DxLib_End() ; return 0 ; } #endif
メンテ
Re: WinMain関数が既に定義されていると表示され、実行されない ( No.3 )
名前:usao 日時:2021/10/13 19:32

「いくつかのコード」を個別の関数内に記述するようにする. WinMainの定義がある cpp にはそれら関数のプロトタイプ宣言を書く. //コードA(別の翻訳単位に実装. A.cpp とか) int MyMain_A(); //コードB(同上. B.cpp とか) int MyMain_B(); //コードC(同上. C.cpp とか) int MyMain_C(); で,WinMainからいずれか1つを呼び出す. (ここで実行する処理を切替える) int WINAPI WinMain( 略 ) {  //return MyMain_A(); //実行しないやつはコメントアウト  return MyMain_B(); //実行するやつ  //return MyMain_C(); //実行しないやつはコメントアウト }
メンテ
Re: WinMain関数が既に定義されていると表示され、実行されない ( No.4 )
名前:usao 日時:2021/10/14 13:46

WinMainの中身はこんなのでもいいけど, これだと1個前の方法と違って, 全ての関数{MyMain_A, MyMain_B, MyMain_C}の定義が必要になる. そこらへんに特段拘らなくてもよい(細かいテストコードを何個か書いてるだけみたいな状況とか)なら, マクロよりは見た目にやさしい(?)かも…? int WINAPI WinMain( 略 ) {  using PseudoEntryPoint = int (*)();  const PseudoEntryPoint PEPs[]  {   MyMain_A,   MyMain_B,   MyMain_C  };  return PEPs[ 1 ](); //※ここのindexの値で切替 }
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存