MFCのスタティックリンク

[戻る]
ララ 2008/02/14(木) 19:37:05
WinXP の環境で VC6, MFC を使っています。

MFCのスタティックリンクってあまり使ったことがなかったんですけど、
今回試してみたところ、デバッグモードだと(exeファイルサイズが大きくなるので)
うまくいっているようですが、リリースモードだとそうなりません。
設定に問題は無いと考えています。

何か考えられる原因はありますか?
よろしくお願いします。

wclrp ( 'o') 2008/02/14(木) 19:51:29
リリースの設定でもMFCをスタティックリンクする設定になってる?
Dependency WalkerつかうとリンクしているDLLを調べてくれる。

Kerry 2008/02/14(木) 19:51:29
「そうならない」とは、静的なリンクが行われていない、
ということですか?
確認したのはファイルサイズの増減だけですか?

VC++付属のDependency WalkerなどでDLLの依存関係を
調べてみてはいかがでしょうか。

wood 2008/02/15(金) 00:47:28
>デバッグモードだと(exeファイルサイズが大きくなるので)
>うまくいっているようですが、リリースモードだとそうなりません。

EXEファイルの大きさの話なんですけど〜
デバッグ情報を含んだリンクしてると必然的にEXEは大きくなりますよ

勘違いしないでくださいね!
MSDNにも記述がありますから、詳細はそちらで確認してください

デバッグモードのビルドオプション直しても、リリースモードの
ビルドオプションが統一的に直る訳じゃないよ
リリースモードでのMFCのスタティックリンク オプションは外れてませんか?
これもMSDNにも記述がありますから、詳細はそちらで確認してください

ララ 2008/02/15(金) 09:07:42
おはようございます。
皆様、ご回答ありがとうございます。

> デバッグ情報を含んだリンクしてると必然的にEXEは大きくなりますよ

なるほど、そういうことですね。

(Q1)リリースモードでリンク

(1)スタティック exeのファイルサイズは 228KB
(2)共有DLL  exeのファイルサイズは  48KB

スタティックにすると180KB増加していますので、リンクされていると考えて良いでしょ
うか?

(Q2)MFCスタティックリンク
 私のあさはかな知識では、共有DLLは mfc42.dll と msvcrt.dll と思っています。
(特別な ocx を使っていない場合)

DependencyWalker のツリー階層のトップには

+ hoge.exe
+ SHIMENG.DLL
+ MFC42.DLL

と表示されていて、msvcrt.dll が見あたりません。何故なのでしょうか?

また、スタティックにしても共有DLLにしてビルドしても

+ hoge.exe
+ SHIMENG.DLL
+ MFC42.DLL

と同じように表示されます。
MFCがスタティックリンクされているか否かを見分ける方法を教えていただけないで
しょうか?

よろしくお願いします。

仲澤@失業者 2008/02/15(金) 13:48:58
> と表示されていて、msvcrt.dll が見あたりません。何故なのでしょうか?

たぶんcrtのメンバを直接使っているところが無いんでしょう。
間接的には使わざるを得ないので子のツリーに現れるはずです。

> また、スタティックにしても共有DLLにしてビルドしても
> + hoge.exe
> + SHIMENG.DLL
> + MFC42.DLL
> と同じように表示されます

それはまずいかも。
MFC42.DLLはroot直下に現れてはいけないと思ういますが、どうんなでしょう。

> MFCがスタティックリンクされているか否かを見分ける方法を教えていただけない> しょうか?

難しいですね、MFCを完全に「排除」してWin32APIだけで構築した場合
DependencyWalkerのroot直下は
・KERNAL32.DLL
・USER32.DLL
・GDI32.DLL
だけになるはずです。MFCを完全にスタティックリンクできるのなら
同じ結果にならないといけないような気もします。

最終的にはXP EmbeddedでMFC抜きのOS環境をこさえて、
その上で動作チェックするしか方法を思いつきませんが、
非現実的ですねぇ。

bun 2008/02/15(金) 16:27:47
VC6でスタティックリンクしてみました。
結果はこんな感じです。
+ KERNEL32.DLL
+ USER32.DLL
+ GDI32.DLL
+ COMDLG32.DLL
+ WINSPOOL.DRV
+ ADVAPI32.DLL
+ SHELL32.DLL
+ COMCTL32.DLL
+ OLEDLG.DLL
+ OLE32.DLL
+ OLEPRO32.DLL
+ OLEAUT32.DLL

ララさんへ、
とにもかくにも、
+ MFC42.DLL
が現れるのはおかしいです。
それでは、動的リンク(共有DLL)だからです。

ララ 2008/02/16(土) 08:21:05
皆様お返事ありがとうございます。

先の報告は DependencyWalker Ver 2.2 6 (フリーソフト)を使った結果です。
(新しいバージョンの方が良いと思ったので、、、)

VC6.0に付属のDependencyWalkerで再確認したところ
ルートにはなく、exe を展開した形で

- hoge.exe
  + MFC42.DLL
  + MSVCRT.DLL
  + KERNEL32.DLL
  + USER32.DLL
  + WSOCK32.DLL

と表示されました。
しかし、スタティックリンクにしても、共有DLLにしてもこのツリー表示はかわりま
せんでした。違いが現れないのはどういうことなのでしょうか?
ファイルサイズには違いがあるので、区別してリンクはされているように思います。

よろしくお願いします。

ITO 2008/02/16(土) 13:07:45
>+ hoge.exe
>+ SHIMENG.DLL
>+ MFC42.DLL

「SHIMENG.DLL」
このDLLは何ですか?
ひょっとして共有DLLで作ってあるとか?

ララ 2008/02/16(土) 14:16:06
ITOさん

お返事ありがとうございます。

>+ hoge.exe
>+ SHIMENG.DLL
>+ MFC42.DLL
>「SHIMENG.DLL」
>このDLLは何ですか?

わかりません。
自作のDLLもありません。

DependencyWalker Ver 2.2.6 の結果なのでこちらは参考にしないでください。

ITO 2008/02/16(土) 18:00:06
> わかりません。
> 自作のDLLもありません。
調べてみたら、WINDOWSのモジュールのひとつみたいですね。
ひょっとしてララさん自作のDLLなのかと思いました。
スタティックリンクの設定を見直してみるのがいいかも知れませんね。

ITO 2008/02/17(日) 11:50:58
ん?、VC6.0プロフェッショナルですよね?

ララ 2008/02/18(月) 10:51:40
>ん?、VC6.0プロフェッショナルですよね?

はい、そうです。

ITO 2008/02/20(水) 12:07:29
>>ん?、VC6.0プロフェッショナルですよね?

>はい、そうです。
だとすると、何がいけないかわからないですね。
実際にWINDOWS XPしかはいってないPCで動かしてみるとかでうかね。
リビルドはしてるんですよね。
あと、DLL,LIBでスタティックリンクしてないのがあるか調べるかですかね。

Kerry 2008/02/20(水) 12:26:03
プロジェクト設定の値を晒してみたらどうですか。

プロジェクトの設定で、Release版の[C/C++]ページと[リンク]ページの
「プロジェクト オプション」の値を見れば何かわかるかもしれません。

ララ 2008/02/20(水) 14:27:40
[[解決]]
ITOさん

>>はい、そうです。
>だとすると、何がいけないかわからないですね。
>実際にWINDOWS XPしかはいってないPCで動かしてみるとかでうかね。
>リビルドはしてるんですよね

VCの環境のないPCで動作させて見ましたが、どちらもすんなり
動いてしまいました(>_<)

Kerryさん

>プロジェクトの設定で、Release版の[C/C++]ページと[リンク]ページの
>「プロジェクト オプション」の値を見れば何かわかるかもしれません。

しかし、これらが何をしめすものなのか、さっぱり理解できませんでした。

とりあえず、ファイルサイズが異なるのでOKと無理矢理解釈します。
解決とさせて頂きますが、問題が発生したら新たに質問させて頂きます。

いろいろ教えて頂き、ありがとうございました。

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