mfc アプリケーションを,コンソールからコンパイルしたいのですが、
以下のようなエラーメッセージが表示されて,コンパイルできません。
$ cl hoge.cpp -MD -D_AFXDLL
...
LINK : fatal error LNK1561: entry point must be defined
たぶん、WinMainを定義しなくてはいけないと思うのですが、VC++の開発環境で,生成されたほ
かのMFCアプリケーションにも,WinMainは定義されていません。(grep で見てみる限り)で
も,開発環境では,コンパイルできる。
なにか、このプログラムは,windows アプリケーションであることをあらわす,コンパイルオプ
ションをつけなくてはいけないのでしょうか?
>たぶん、WinMainを定義しなくてはいけないと思うのですが
どう言うソースをコンパイルしているのか知りませんが
あなたの指定しているコンパイルオプションを参考にすれば
「WinMain」は必要ありません
変わりに必要なのは
「DLLMAIN」が必要なのでは無いのでしょうか
尚、MFCで生成されるソースには確かに
「WinMain」は存在しません
しかし、それに相当する
CXXXXApp クラスが存在しているはずです
参考に
MICROSOFT PRESS
Inside Visual C++ Ver 4または5
に
MFCにWinMainがなぜないのか 解説あったはずです
(総合)開発環境ではコンパイルできるのですよね。
VC++を使ってるのでしたらビルド時にプロジェクト名.plg
というファイルが出来てると思います。
そのファイルを見ると、どうやってコンパイルとリンクを
したかが記録されてるはずです。
それを参考にしてみては如何でしょう。
VC++6であれば、IDEがmakefileを生成できるはず。
ごめんなさい
>wood 2003/10/13(月) 11:04:05
>あなたの指定しているコンパイルオプションを参考にすれば
>「WinMain」は必要ありません
>変わりに必要なのは
>「DLLMAIN」が必要なのでは無いのでしょうか
この回答間違っていました(と思います ^^;)
>mfc アプリケーション
にはなぜ「WinMain」は定義されていないのかについて
学習した方が良いのではないでしょうか
質問していないことでしょうけど
>makefile
は「.MAK」のことです、ただし見ても余計こんがらがるのでは?
詳細はMSDNで「NMAKE」をキーワードに参照し読み込んでください
コンパイルオプションは「makefile」を見ずとも
統合環境の「プロジェクト」->「設定」->「C/C++ タブ」の「一般」
を見れば何が指定されているか「プロジェクトオプション」を参考に
>euro2004 2003/10/13(月) 14:55:11
が言っている
>プロジェクト名.plg
の記述と同等のことが記述されています
MSDN「CL オプション」「コンパイラ リファレンス」を参考に
読み取ってください
情報が不十分だったので,補足します。
私が今,コンパイルしようとしているのは,たとえば,以下のようなファイルです。
#include <afxwin.h>
class CMyApp : CWinApp
{
public:
BOOL InitInstance(); //
};
BOOL CMyApp::InitInstance()
{
AfxMessageBox(hoge);
return TRUE;
}
で、わたしが、
->VC++の開発環境で,生成されたほかのMFCアプリケーション
といっているのは、IDEで、MFC アプリケーションをつくった物で,このプログラムではありま
せん。
.plgファイルを参考に,以下のようにすると,
$ cl hoge.cpp -MD -D_AFXDLL /c /* compile only */
$ link /subsystem:windows hoge.obj
hoge.exeができました、でも、実行すると,0x6ab1b4ec の命令が0x00000000のメモリ を参照
して,エラーになってしまいます。
>以下のようなエラーメッセージが表示されて,コンパイルできません
は解決したんだったら別スレッドにして
>hoge.exeができました、でも、実行すると,
>0x6ab1b4ec の命令が0x00000000のメモリ を参照
>して,エラーになってしまいます
デバック手法について質問したほうが良いのではないですか
>して,エラーになってしまいます
そうでですか!
だから何を聞きたいの?
>ftake2000さん
>$ cl hoge.cpp -MD -D_AFXDLL /c /* compile only */
>$ link /subsystem:windows hoge.obj
そっくり同じやり方で正しく実行出来ましたのでそのソースをコンパイルするにはオプションが
足りないのかも。
それと、もしそのソースが全部ならCMyAppのインスタンスがないのも気になる。
CMyApp theApp;
なりがありますか?
>るさん
そう、きっと、compileか、リンクのときの、オプションが何か足りないんです。
それが、私の質問です。わかりにくくてすみません。
>それと、もしそのソースが全部ならCMyAppのインスタンスがないのも気になる。
>CMyApp theApp;
>なりがありますか
ソースは、それで全部です。
CWinAppと、WinMainの関係が、よくわかっていないんですが、link時
の、/subsystem:windows オプションが、
WinMain を定義して、その中で、CWinApp を継承しているクラス(ここでは、CMyApp)の
インスタンスをつくる。というようなことを意味しているんじゃないかと思っているんで
すけど。
>>CMyApp theApp;
>>なりがありますか
> ソースは、それで全部です。
呈示されたコードに CMyApp theApp; を追加してコンパイル・リンクしたら、
ちゃんと動いてくれました。
> /subsystem:windows オプションが、
> WinMain を定義して、その中で、CWinApp を継承しているクラス(ここでは、CMyApp)の
> インスタンスをつくる。というようなことを意味しているんじゃないかと思っているんで
> すけど。
違います。
/subsystem:windows は 'エントリポイントを WinMain とせよ' という使令です。
勝手に WinMain を作ることはありませんし、CWinAppインスタンスを生成することも
ありません。。
>呈示されたコードに CMyApp theApp; を追加してコンパイル・リンクしたら、
ちゃんと動いてくれました。
できました。ありがとうございます。