MFCのスタティックリンク – プログラミング – Home

MFCのスタティックリンク
 
通知
すべてクリア

[解決済] MFCのスタティックリンク

固定ページ 1 / 2

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

WinXP の環境で VC6, MFC を使っています。

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

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


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

リリースの設定でもMFCをスタティックリンクする設定になってる?
Dependency WalkerつかうとリンクしているDLLを調べてくれる。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

「そうならない」とは、静的なリンクが行われていない、
ということですか?
確認したのはファイルサイズの増減だけですか?

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


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

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

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

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

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


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

おはようございます。
皆様、ご回答ありがとうございます。

> デバッグ情報を含んだリンクしてると必然的に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がスタティックリンクされているか否かを見分ける方法を教えていただけないで
しょうか?

よろしくお願いします。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

> と表示されていて、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
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

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)だからです。


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

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

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

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

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

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

よろしくお願いします。


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

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

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


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

ITOさん

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

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

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

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


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

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


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

ん?、VC6.0プロフェッショナルですよね?


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

>ん?、VC6.0プロフェッショナルですよね?

はい、そうです。


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

>>ん?、VC6.0プロフェッショナルですよね?

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


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

プロジェクト設定の値を晒してみたらどうですか。

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


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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