mfc applicationを、cl でコンパイル

[戻る]
ftake2000 2003/10/13(月) 08:59:09
mfc アプリケーションを,コンソールからコンパイルしたいのですが、
以下のようなエラーメッセージが表示されて,コンパイルできません。
$ cl hoge.cpp -MD -D_AFXDLL
...
LINK : fatal error LNK1561: entry point must be defined

たぶん、WinMainを定義しなくてはいけないと思うのですが、VC++の開発環境で,生成されたほ
かのMFCアプリケーションにも,WinMainは定義されていません。(grep で見てみる限り)で
も,開発環境では,コンパイルできる。

なにか、このプログラムは,windows アプリケーションであることをあらわす,コンパイルオプ
ションをつけなくてはいけないのでしょうか?

wood 2003/10/13(月) 11:04:05
>たぶん、WinMainを定義しなくてはいけないと思うのですが

どう言うソースをコンパイルしているのか知りませんが
あなたの指定しているコンパイルオプションを参考にすれば
「WinMain」は必要ありません
変わりに必要なのは
「DLLMAIN」が必要なのでは無いのでしょうか

尚、MFCで生成されるソースには確かに
「WinMain」は存在しません
しかし、それに相当する
CXXXXApp クラスが存在しているはずです

参考に
MICROSOFT PRESS 
Inside Visual C++ Ver 4または5
に
MFCにWinMainがなぜないのか 解説あったはずです

euro2004 2003/10/13(月) 14:55:11
(総合)開発環境ではコンパイルできるのですよね。
VC++を使ってるのでしたらビルド時にプロジェクト名.plg
というファイルが出来てると思います。

そのファイルを見ると、どうやってコンパイルとリンクを
したかが記録されてるはずです。

それを参考にしてみては如何でしょう。

επιστημη 2003/10/13(月) 23:11:17
VC++6であれば、IDEがmakefileを生成できるはず。

wood 2003/10/14(火) 06:18:17
ごめんなさい
>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 オプション」「コンパイラ リファレンス」を参考に
読み取ってください

ftake2000 2003/10/14(火) 07:51:26
情報が不十分だったので,補足します。
私が今,コンパイルしようとしているのは,たとえば,以下のようなファイルです。

#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のメモリ を参照
して,エラーになってしまいます。

wood 2003/10/14(火) 08:07:37
>以下のようなエラーメッセージが表示されて,コンパイルできません
は解決したんだったら別スレッドにして

>hoge.exeができました、でも、実行すると,
>0x6ab1b4ec の命令が0x00000000のメモリ を参照
>して,エラーになってしまいます
デバック手法について質問したほうが良いのではないですか

>して,エラーになってしまいます
そうでですか!
だから何を聞きたいの?

2003/10/14(火) 09:11:13
>ftake2000さん
>$ cl hoge.cpp  -MD -D_AFXDLL /c /* compile only */
>$ link /subsystem:windows  hoge.obj
そっくり同じやり方で正しく実行出来ましたのでそのソースをコンパイルするにはオプションが
足りないのかも。
それと、もしそのソースが全部ならCMyAppのインスタンスがないのも気になる。
CMyApp theApp;
なりがありますか?

ftake2000 2003/10/14(火) 11:41:47
>るさん
そう、きっと、compileか、リンクのときの、オプションが何か足りないんです。
それが、私の質問です。わかりにくくてすみません。

>それと、もしそのソースが全部ならCMyAppのインスタンスがないのも気になる。
>CMyApp theApp;
>なりがありますか
ソースは、それで全部です。

CWinAppと、WinMainの関係が、よくわかっていないんですが、link時
の、/subsystem:windows  オプションが、
WinMain を定義して、その中で、CWinApp を継承しているクラス(ここでは、CMyApp)の
インスタンスをつくる。というようなことを意味しているんじゃないかと思っているんで
すけど。

επιστημη [E-Mail] [HomePage] 2003/10/14(火) 11:54:03
>>CMyApp theApp;
>>なりがありますか
> ソースは、それで全部です。

呈示されたコードに CMyApp theApp; を追加してコンパイル・リンクしたら、
ちゃんと動いてくれました。

> /subsystem:windows  オプションが、
> WinMain を定義して、その中で、CWinApp を継承しているクラス(ここでは、CMyApp)の
> インスタンスをつくる。というようなことを意味しているんじゃないかと思っているんで
> すけど。

違います。
/subsystem:windows は 'エントリポイントを WinMain とせよ' という使令です。
勝手に WinMain を作ることはありませんし、CWinAppインスタンスを生成することも
ありません。。

ftake2000 2003/10/14(火) 13:05:41
[[解決]]
>呈示されたコードに CMyApp theApp; を追加してコンパイル・リンクしたら、
ちゃんと動いてくれました。
できました。ありがとうございます。

古いスレッドには追加発言できません。