mfc applicationを、cl でコンパイル – プログラミング – Home

通知
すべてクリア

[解決済] mfc applicationを、cl でコンパイル


ftake2000
 ftake2000
(@ftake2000)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

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

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

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


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>たぶん、WinMainを定義しなくてはいけないと思うのですが

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

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

参考に
MICROSOFT PRESS 
Inside Visual C++ Ver 4または5

MFCにWinMainがなぜないのか 解説あったはずです


返信引用
euro2004
 euro2004
(@euro2004)
ゲスト
結合: 22年前
投稿: 37
 

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

VC++6であれば、IDEがmakefileを生成できるはず。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

ごめんなさい
>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
 ftake2000
(@ftake2000)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

情報が不十分だったので,補足します。
私が今,コンパイルしようとしているのは,たとえば,以下のようなファイルです。

#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
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>以下のようなエラーメッセージが表示されて,コンパイルできません
は解決したんだったら別スレッドにして

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

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


返信引用
る
 る
(@る)
ゲスト
結合: 22年前
投稿: 5
 

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


返信引用
ftake2000
 ftake2000
(@ftake2000)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

>るさん
そう、きっと、compileか、リンクのときの、オプションが何か足りないんです。
それが、私の質問です。わかりにくくてすみません。

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

>>CMyApp theApp;
>>なりがありますか
> ソースは、それで全部です。

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

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

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


返信引用
ftake2000
 ftake2000
(@ftake2000)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

>呈示されたコードに CMyApp theApp; を追加してコンパイル・リンクしたら、
ちゃんと動いてくれました。
できました。ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました