WinXP の環境で VC6, MFC を使っています。
MFCのスタティックリンクってあまり使ったことがなかったんですけど、
今回試してみたところ、デバッグモードだと(exeファイルサイズが大きくなるので)
うまくいっているようですが、リリースモードだとそうなりません。
設定に問題は無いと考えています。
何か考えられる原因はありますか?
よろしくお願いします。
リリースの設定でもMFCをスタティックリンクする設定になってる?
Dependency WalkerつかうとリンクしているDLLを調べてくれる。
「そうならない」とは、静的なリンクが行われていない、
ということですか?
確認したのはファイルサイズの増減だけですか?
VC++付属のDependency WalkerなどでDLLの依存関係を
調べてみてはいかがでしょうか。
>デバッグモードだと(exeファイルサイズが大きくなるので)
>うまくいっているようですが、リリースモードだとそうなりません。
EXEファイルの大きさの話なんですけど~
デバッグ情報を含んだリンクしてると必然的にEXEは大きくなりますよ
勘違いしないでくださいね!
MSDNにも記述がありますから、詳細はそちらで確認してください
デバッグモードのビルドオプション直しても、リリースモードの
ビルドオプションが統一的に直る訳じゃないよ
リリースモードでのMFCのスタティックリンク オプションは外れてませんか?
これもMSDNにも記述がありますから、詳細はそちらで確認してください
おはようございます。
皆様、ご回答ありがとうございます。
> デバッグ情報を含んだリンクしてると必然的に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がスタティックリンクされているか否かを見分ける方法を教えていただけないで
しょうか?
よろしくお願いします。
> と表示されていて、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環境をこさえて、
その上で動作チェックするしか方法を思いつきませんが、
非現実的ですねぇ。
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)だからです。
皆様お返事ありがとうございます。
先の報告は DependencyWalker Ver 2.2 6 (フリーソフト)を使った結果です。
(新しいバージョンの方が良いと思ったので、、、)
VC6.0に付属のDependencyWalkerで再確認したところ
ルートにはなく、exe を展開した形で
- hoge.exe
+ MFC42.DLL
+ MSVCRT.DLL
+ KERNEL32.DLL
+ USER32.DLL
+ WSOCK32.DLL
と表示されました。
しかし、スタティックリンクにしても、共有DLLにしてもこのツリー表示はかわりま
せんでした。違いが現れないのはどういうことなのでしょうか?
ファイルサイズには違いがあるので、区別してリンクはされているように思います。
よろしくお願いします。
>+ hoge.exe
>+ SHIMENG.DLL
>+ MFC42.DLL
「SHIMENG.DLL」
このDLLは何ですか?
ひょっとして共有DLLで作ってあるとか?
ITOさん
お返事ありがとうございます。
>+ hoge.exe
>+ SHIMENG.DLL
>+ MFC42.DLL
>「SHIMENG.DLL」
>このDLLは何ですか?
わかりません。
自作のDLLもありません。
DependencyWalker Ver 2.2.6 の結果なのでこちらは参考にしないでください。
> わかりません。
> 自作のDLLもありません。
調べてみたら、WINDOWSのモジュールのひとつみたいですね。
ひょっとしてララさん自作のDLLなのかと思いました。
スタティックリンクの設定を見直してみるのがいいかも知れませんね。
ん?、VC6.0プロフェッショナルですよね?
>ん?、VC6.0プロフェッショナルですよね?
はい、そうです。
>>ん?、VC6.0プロフェッショナルですよね?
>はい、そうです。
だとすると、何がいけないかわからないですね。
実際にWINDOWS XPしかはいってないPCで動かしてみるとかでうかね。
リビルドはしてるんですよね。
あと、DLL,LIBでスタティックリンクしてないのがあるか調べるかですかね。
プロジェクト設定の値を晒してみたらどうですか。
プロジェクトの設定で、Release版の[C/C++]ページと[リンク]ページの
「プロジェクト オプション」の値を見れば何かわかるかもしれません。