トップページ > プログラム > 2014年09月01日 > X69OanmZ

書き込み順位&時間帯一覧

3 位/206 ID中時間01234567891011121314151617181920212223Total
書き込み数20000003000000203100000011



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
MFC相談室 mfc22d.dll

書き込みレス一覧

【GUI】wxWidgets(旧wxWindows) その5【サイザー】
703 :デフォルトの名無しさん[sage]:2014/09/01(月) 00:00:47.70 ID:X69OanmZ
>>700
>wxWidgetsは通常のGUI用ライブラリに一枚レイヤを重ねた形になるので
>型情報・関数テーブルの情報だけで結構容量食う

オイラはコンパイラの基本部分に詳しいが、それだけで1MBなどには
ならない。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
704 :デフォルトの名無しさん[sage]:2014/09/01(月) 00:06:51.19 ID:X69OanmZ
>>694
諦めることも手かも知れないけど、やっている事の規模とサイズとの
ギャップに納得がいかない人もいるはず。

wxWidgetsはラッピング・ライブラリの一種。

8bit時代、16bit時代を知る人にとって、Widget 程度が64KBを超える
事があってはならない。どういうプログラミングをしたら2MBにもなる
のか。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
706 :デフォルトの名無しさん[sage]:2014/09/01(月) 07:25:22.06 ID:X69OanmZ
>>591 のライブラリを samples/keyboard にも使ってみたら、
keyboard.exe のサイズを 1,619,968 にまで縮小することに成功した。
コンパイラは MinGW32 のまま。
条件は:release, 非UNICODE(ASCII), SHARED=0(静的リンク), MONOLITHIC = 1

どうやら MONOLITHIC であるかどうかは最終 exe サイズには関係してないらしい。
ライブラリと言うのは集めてもばらしても、最終 exe のリンク結果には影響を
及ぼさない事が基本なので、元々当たり前なことなのだが。



[samples/keyboard]
$ mingw32-make -f makefile.gcc BUILD=release UNICODE=0 SHARED=0 MONOLITHIC=1


[samples/keyboard/makefile.gcc の修整]
-------------------------------------------------------------------------------------
$(OBJS)\keyboard.exe: $(KEYBOARD_OBJECTS) $(OBJS)\keyboard_keyboard_rc.o
     $(CXX) -o $@ $(KEYBOARD_OBJECTS) $(__DEBUGINFO) $(__THREADSFLAG)
-L$(LIBDIRNAME) -Wl,--subsystem,windows -Wl,--gc-sections -Wl,-s -mwindows
$(____CAIRO_LIBDIR_FILENAMES_p) $(LDFLAGS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p)
$(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p)
-lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG)
$(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) $(__GDIPLUS_LIB_p) $(__CAIRO_LIB_p)
-lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32
-loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32
--------------------------------------------------------------------------------------

上記は original の makefile.gcc に、
-Wl,--gc-sections -Wl,-s
を追加しただけ。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
707 :デフォルトの名無しさん[sage]:2014/09/01(月) 07:31:05.33 ID:X69OanmZ
誤:>>591
正:>>691
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
709 :デフォルトの名無しさん[sage]:2014/09/01(月) 07:45:41.49 ID:X69OanmZ
>>694
>あとコア、主要のライブラリのビルドから、ダイナミックリンクを徹底してOSに丸投げしたら小さくなるだろ。

「>>692」で示した Win32 import library は、Windows のシステム DLL
をリンクするための小さなライブラリ。例えば、
libcomctrl32 をリンクしていても、実際は、comctrl32.dll が動的リンク
される。libcomctrl32.a は、MinGW32 が用意している import library で:

/xxx/CodeBlocks/MinGW/lib/libcomctl32.a # 86,428 bytes
C:/WINDOWS/system32/comctl32.dll     # 617,472 bytes

のように、windows/system32 の comctrl32.dll を動的リンクするための
呼び出し部分だけを提供する小さなライブラリ。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
711 :デフォルトの名無しさん[sage]:2014/09/01(月) 14:09:14.38 ID:X69OanmZ
MONOLITHIC の値が違うと別の *.o が作成されることが判明。
以下は、SHARED=0(静的リンク)の場合の、MONOLITHIC が 0 と 1 の場合。

CORELIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \
  $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
  $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \
  $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) \
  $(__MSLU_DEFINE_p) $(__GFXCTX_DEFINE_p) -I$(SETUPHDIR) -I..\..\include \
  $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING -I..\..\src\tiff \
  -I..\..\src\jpeg -I..\..\src\png -I..\..\src\zlib -I..\..\src\regex \
  -I..\..\src\expat\lib -DwxUSE_BASE=0 $(__RTTIFLAG) $(__EXCEPTIONSFLAG) \
  -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS)

MONOLIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \
  $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
  $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \
  $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) \
  $(__MSLU_DEFINE_p) $(__GFXCTX_DEFINE_p) -I$(SETUPHDIR) -I..\..\include \
  $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING -I..\..\src\tiff \
  -I..\..\src\jpeg -I..\..\src\png -I..\..\src\zlib -I..\..\src\regex \
  -I..\..\src\expat\lib -DwxUSE_BASE=1 $(__RTTIFLAG) $(__EXCEPTIONSFLAG) \
  -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS)
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
712 :デフォルトの名無しさん[sage]:2014/09/01(月) 14:13:21.84 ID:X69OanmZ
違いは、-DwxUSE_BASE の部分で、
 MONOLITHIC = 0 の場合 : -DwxUSE_BASE=0  // #define wxUSE_BASE 0
 MONOLITHIC = 1 の場合 : -DwxUSE_BASE=1  // #define wxUSE_BASE 1
となっている。

例えば、/xxx/src/msw/dc.cpp は、同じソースに対し make に渡すオプションに応じて
以下の2種類の *.o ファイルが作成される。
1つ目は、MONOLITHIC=0の時に作られ、2つ目は、MONOLITHIC=1の時に作られる。

ifeq ($(USE_GUI),1)
$(OBJS)\corelib_dc.o: ../../src/msw/dc.cpp
  $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif

ifeq ($(USE_GUI),1)
$(OBJS)\monolib_dc.o: ../../src/msw/dc.cpp
  $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif

ソースを見ると、wxUSE_BASE の値に応じて場合分けされている箇所が多数ある。
つまり、MONOLITHIC の 0 と 1 の違いは単に *.o ファイルの集め方の問題では無い。
コンパイル時点のソース自体が変更されるのである。故にリンク後の*.exe のサイズ
が変わって来ても不思議は無い。これは驚くべきことである。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
714 :デフォルトの名無しさん[sage]:2014/09/01(月) 16:14:53.94 ID:X69OanmZ
>>713
コンパイルオプションまで変えてしまって何をやっているかと言うこと
なんだよ。ライブラリの集め方だけの問題じゃないって事なんだ。

ライブラリの動作が変わってしまい、MONOLITHIC が 0 と 1とで結果が違うことに
悩まされる可能性もある。

単にライブラリのオブジェクトの集め方(含み方)の問題では無いとすると、MONOLITHIC
オプションの意味はいったい何かと言う問題になる。


また、最終EXEが大きくなる理由として、アプリが使ってないオブジェクトを
非常に基本的なライブラリの一部が参照している可能性がある。
そしてそのオブジェクトが別のオブジェクトを勝手に参照して・・・という
事が続いて最終EXEのサイズが肥大化してしまっているのかも知れない。
MFC相談室 mfc22d.dll
595 :デフォルトの名無しさん[sage]:2014/09/01(月) 16:27:29.06 ID:X69OanmZ
>>592
UNICODE(ここでは WIDE 文字の意味)だけだと、2BYTE文字までの対応に
とどまる。
それでは足りないと言うことで、サロゲートペアが導入された。
もともと、1文字を 1 つの wchar_t 変数だけで済まそうと思った
のが Windows における UNICODE 対応だったが、その前提が崩れた。

元々、国産機時代から、SHIFT-JIS が使われていたが、
それは、1文字を全部2BYTEで表すよりは効率が良かったからだ。
8 bits, 16 bits マシンでも効率が良く処理できた。
同様の仕組みの UTF8 は全てを WIDE 文字で表す Windows の
UNICODE 対応よりは効率が良い可能性が高い。
分かりやすい上に、一度対応してしまうとその後何もすること
も無い。

2BYTEでも1BYTEでも今のCPUでは速度が変わらないように思えるが、
使用するメモリが増大することによる効率低下はまだ無視できない。
ASCII文字まで2BYTEで書くのは効率が悪い。最近、ASCII文字まで
2BYTEで表現されたテキストファイルを見たことがあるが、
あれは馬鹿ではなかろうか。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
715 :デフォルトの名無しさん[sage]:2014/09/01(月) 16:33:12.36 ID:X69OanmZ
http://wiki.wxwidgets.org/WxWidgets_Build_Configurations

「MONOLITHIC=1 :
 Packages all libraries in a single file.
 (Note: do not combine this option with a static build.)」

とあった。static build の時は、MONOLITHIC=1 にするな、と
書かれている・・・。
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
718 :デフォルトの名無しさん[sage]:2014/09/01(月) 17:31:47.05 ID:X69OanmZ
>>717
そういうわけではない。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。