X



【GUI】wxWidgets(旧wxWindows) その5【サイザー】
0001デフォルトの名無しさん
垢版 |
2010/04/09(金) 15:12:36
クロスプラットフォーム GUI ライブラリの wxWidgets (旧 wxWindows)についてのスレ。

本家
 ttp://www.wxwidgets.org/
wxWindows日本語プロジェクト
 ttp://wxwindowsjp.sourceforge.jp/
Cross-Platform Programming with wxWidgets
 ttp://wxwidgets.info/
Let's wxWidgets
 ttp://dot-gray.s33.xrea.com/
wxWindowsで始めるC++ GUIプログラミング
 ttp://www.h3.dion.ne.jp/~k5_n/wxwin/
wxWidgets でクロスプラットフォーム GUIアプリを作ろう
 ttp://0xcc.net/pub/uu-2004-08/

前スレ
【GUI】wxWidgets(旧wxWindows) その4【サイザー】
http://pc12.2ch.net/test/read.cgi/tech/1214657360/
0669デフォルトの名無しさん
垢版 |
2014/08/27(水) 10:01:06.29ID:J2peHUgZ
つまり、イベント・ハンドラを追加したとき、

BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
EVT_PAINT (wxListMainWindow::OnPaint)
EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse)
EVT_CHAR (wxListMainWindow::OnChar)
EVT_KEY_DOWN (wxListMainWindow::OnKeyDown)
EVT_KEY_UP (wxListMainWindow::OnKeyUp)
EVT_SET_FOCUS (wxListMainWindow::OnSetFocus)
EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus)
EVT_SCROLLWIN (wxListMainWindow::OnScroll)
EVT_CHILD_FOCUS (wxListMainWindow::OnChildFocus)
END_EVENT_TABLE()

とか、クラスを書くとき

IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow)

見たいなものの自動生成があるとうれしいんですが、そういう IDE
はありません?
0670デフォルトの名無しさん
垢版 |
2014/08/29(金) 11:13:03.59ID:AEJEOYpd
wxWidgetsの問題点の1つは、プログラムのサイズが大きくなる事。
特に静的リンクしたときに顕著。

Windows は、VC++ にて、
ac1rd: CUI の Win32 と printf() を使ったもののリリース・動的リンク版が 16KB程度。
    puts() を使えばもっと小さく出来る。
ac1rs: CUI の Win32 と printf() を使ったもののリリース・静的リンク版が 40KB程度。
    puts() を使えばもっと小さく出来る。
ag2rd: GUI の MFC の 基本的な MDI アプリがリリース・動的リンク版で 36 KB 程度。
ag2rs: GUI の MFC の 基本的な MDI アプリがリリース・静的リンク版で 332 KB 程度。


wxWidgets 2.8.12 の samples では、
bc1rd: CUI の console.exe がリリース・動的リンク版で 138KB
bc1rs: CUI の console.exe がリリース・静的リンク版で 863KB
bc1dd: CUI の console.exe がデバッグ・動的リンク版で 184KB

bg2rd: GUI の keyboard.exe がリリース・動的リンク版で 293KB
bg2rs: GUI の keyboard.exe がリリース・静的リンク版で 2,924KB
bg2dd: GUI の keyboard.exe がデバッグ・動的リンク版で 492KB

ただし、bc1xx は、アプリ本体のプログラムが複雑なことをしているようなので、
もっと小さく出来る可能性があり。
0671デフォルトの名無しさん
垢版 |
2014/08/29(金) 19:04:31.75ID:GS9LyL7J
その説明にac1だの何だの自分以外分からない定義を使う必要があったのだろうか
0672デフォルトの名無しさん
垢版 |
2014/08/29(金) 19:07:59.00ID:AEJEOYpd
今から見るとそうかも。
a: Windows Native or MFC
b: wzWidgets
c: CUI
g: GUI
r:release, d:debug
d:dynamic link, s:static link
0673デフォルトの名無しさん
垢版 |
2014/08/30(土) 00:17:55.46ID:S/CtHe8u
>>668

>最後の段落:多分、wxWidgets 本体を MInGW32 用のビルドする際は、
>configure は使えない気がする。

なにいってんだCodeBlocksのドキュメントにそう書いてあるだけで
基本autotoolsで作られたソースはconfigureでビルドできるぞ
実際自分はWindows上のmingw32/64、LinuxのクロスビルドからのMinGWでconfigure使ってる

なぜMakefileでやれという指示なのかというと、そのほうが簡潔で保守しやすいからだ
あとGNU MakeじゃないMakeでもビルドできるようにしたいとかいう微妙なこだわりが有る場合も有る

>>669
エディタの補助機能を使うべきだ、Emacsなら矩形範囲選択で一気に書ける
ソースのひな形自動生成機能は知らんなあ
0675デフォルトの名無しさん
垢版 |
2014/08/30(土) 07:56:49.02ID:pUv0T+7B
>>674
Stripに詳しくないので、言っている意味が分からない。

Stripって Release 用に Build した Binary に対して行っても
サイズダウンできたりするの?
0676デフォルトの名無しさん
垢版 |
2014/08/30(土) 07:58:19.03ID:pUv0T+7B
>>674
Stripに詳しくないので、言っている意味が分からない。

Stripって Release 用に Build した Binary に対して行っても
サイズダウンできたりするの?
0677デフォルトの名無しさん
垢版 |
2014/08/30(土) 08:15:51.54ID:hpIa4Qjb
日本語インライン入力の対応ってまだなの?
というか予定自体なくて諦めた方がいい?
wxWidgets使ってるEditraってエディタにそろそろ移行できるかなと
思って試してみたら、未だにインライン入力できない
0678デフォルトの名無しさん
垢版 |
2014/08/30(土) 08:19:53.34ID:pUv0T+7B
>>674

小さくなりますた!!


Relese, 動的リンク
/wxWidgets-2.8.12/samples/keyboard/gcc_mswdll/keyboard.exe

strip 前:299,808 bytes
strip 後:124,430 bytes

Relese, 静的リンク
/wxWidgets-2.8.12/samples/keyboard/gcc_msw/keyboard.exe

strip 前:2,993,255 bytes
strip 後:1,887,758 bytes

strip 後も、*.exe が正常に起動することを確認済み。
0680デフォルトの名無しさん
垢版 |
2014/08/30(土) 11:51:11.86ID:RJxcDZkh
馬鹿には無理
0681デフォルトの名無しさん
垢版 |
2014/08/30(土) 12:02:34.82ID:S/CtHe8u
スタンド・アローン・コンプレックスと化した馬鹿には無理さんオッスオッス

>>679
cua-modeでググって
http://qiita.com/yyamamot/items/7efcbfdcccdb5fa45ebe

例えばイベントテーブルとかはこれでザクッと一気に書ける
もちろん個々のwxWindowIDとメソッド定義は書かなくてはいけないが
クラス名とマクロ定義は同じ文字列の繰り返しなのでだいぶ楽になる
0682デフォルトの名無しさん
垢版 |
2014/08/30(土) 13:53:01.64ID:pUv0T+7B
>>681
あー、そういう風に沢山のイベントを一気に書きたいんじゃなくて、
開発段階で徐々にイベントを追加して行く際に、

1. *.h のクラス内にメンバ関数宣言
2. *.cpp に EVENT MAP
3. *.cpp に メンバ関数定義の本体

の三箇所にコードを書くのが面倒ということなんだわ。
0684デフォルトの名無しさん
垢版 |
2014/08/30(土) 19:11:57.66ID:5dlfaubU
wxFormBuilderでしかGUIとイベントを設計できない俺には何言ってるのかさっぱりわからんぜよ……
0685678
垢版 |
2014/08/31(日) 15:54:21.95ID:X+I89xFV
wxAUI のデモ・アプリ wxauitest.exe のサイズは、1,417,216 bytes。
スタンドアロンのアプリで、環境変数からパスを完全に消去しても起動
できた。つまり、ライブラリはDLLを使わずに静的リンクされている。
wxAUIはFloating & Dockingのできる強力なGUI。

>>678 に示した keyboard.exe はキーボードから押されたキーの値を
表示するだけで、上記アプリよりずっとシンプルなのにも関わらず、
1,887,758 bytes と 470,542 bytes も大きい。

理由は不明。
0688678
垢版 |
2014/08/31(日) 17:34:23.46ID:X+I89xFV
Windows実行形式であっても、コンパイラが、MinGW32 と VC++ でサイズに
大幅な違いが出てくるのかな?
0689678
垢版 |
2014/08/31(日) 17:41:03.82ID:X+I89xFV
>>687
それは DLL 版だよ。絶対に。
0690デフォルトの名無しさん
垢版 |
2014/08/31(日) 19:56:13.33ID:F1QgxQvq
>>685
実行ファイルの関数テーブルに何が入っているか nm で確認したら少しはわかるかもね

>>688
大幅とは行かないかもしれないがVC++はWindowsのみをターゲットにしているから
基本的にコンパイル後のバイナリサイズは MinGW > VC++ だよね
0691デフォルトの名無しさん
垢版 |
2014/08/31(日) 20:18:05.13ID:da+aRwUf
CodeBlocks + MinGW32 で、
wxWidgets の Monolithic、ASCIIライブラリ, 静的リンク で
最も簡単な Frame Based な GUI を作成してみたら、
2,073,600 バイトよりは小さくならなかった。

wxWidgets のライブラリは、
-Os
-ffunction-sections
-fdata-sections
でコンパイルし、
-Wl,--gc-sections -s
でライブラリ化した。その時のコマンド:

mingw32-make -j2 -f makefile.gcc CPPFLAGS="-MD -MP -DHAVE_W32API_H
-D__WXMSW__ -DNOPCH -DwxDEBUG_LEVEL=0 -DNDEBUG" CFLAGS="-mthreads
-fmessage-length=0 -ffunction-sections -fdata-sections -fno-builtin
-Os" CXXFLAGS="-mthreads -Wno-ctor-dtor-privacy -fmessage-length=0
-ffunction-sections -fdata-sections -fno-builtin -Os
-fno-keep-inline-dllexport" LDFLAGS="-Wl,--subsystem,windows
-Wl,--gc-sections -s -mthreads -mwindows"
BUILD=release UNICODE=0 SHARED=0 MONOLITHIC=1


CodeBlocks でアプリのリンクのオプションにも、
-Wl,--gc-sections -s
は付けてある。
0692デフォルトの名無しさん
垢版 |
2014/08/31(日) 20:27:38.74ID:da+aRwUf
ちなみに、Unicode 版より ASCII 版のほうが小さくなることを確認済みである。

[Compiler settings - #defines]
が、標準では、
__GNUWIN32__, __WXMSW__, WXUSINGDLL, wxUSE_UNICODE, WX_PRECOMP
となるところを:
__GNUWIN32__, __WXMSW__
だけとし、

[Search Directories] の Compiler, Linker, Compiler
の、gcc_dll の部分を、gcc_lib に変えた。

アプリにリンクするリンクライブラリとしては、上記で作成した Monolithic
ライブラリだけでは足りず、以下が必要であった。Win32のimport libraryは、
ライブラリを動的リンクする場合はライブラリのDLLが行っているので必要ない
が、ライブラリを静的リンクする場合は、アプリが直接リンクする必要がある
ため必要となるのは理解できる。libwxpng, libwxjpeg, libwxtiff, libwxzlib
が必要となった理由は不明。

libwxmsw28 // これが wxWidgets の monolithic ライブラリ本体。
libwxpng
libwxjpeg
libwxtiff
libwxzlib
libuuid // Win32 の import library
libcomctrl32 // Win32 の import library
libwinspool // Win32 の import library
liboleaut32 // Win32 の import library
libole32 // Win32 の import library

ちなみに、wxWidgets を動的リンクする場合は、ここが、libwxmsw28
だけで済む。
0693デフォルトの名無しさん
垢版 |
2014/08/31(日) 20:33:24.61ID:da+aRwUf
誤:[Search Directories] の Compiler, Linker, Compiler
正:[Search Directories] の Compiler, Linker, Resource Compiler

誤:Win32のimport libraryは、ライブラリを動的リンクする場合はライブ
  ラリのDLLが行っているの
正:wxWidgets ライブラリをアプリに動的リンクする場合は
  wxWidgets ライブラリの DLL 部分が Win32 の import library の
  リンクを行っているの
0694デフォルトの名無しさん
垢版 |
2014/08/31(日) 20:45:44.37ID:0aT2mco7
サイズはどうでもよくないか。exeを使う側としては速度では?
あとコア、主要のライブラリのビルドから、ダイナミックリンクを徹底してOSに丸投げしたら小さくなるだろ。
0696デフォルトの名無しさん
垢版 |
2014/08/31(日) 20:58:57.78ID:da+aRwUf
>>694
でも wxWidgets がやっていることの割にはリンクされるバイト数が多すぎる
感じがする。
基本、Win32をラッピングしているだけなのだから、2MBも必要ない。
0697デフォルトの名無しさん
垢版 |
2014/08/31(日) 21:00:34.83ID:ks+4W1rG
ラッピングしてるだけじゃなくマルチプラットフォームのために徹底した抽象化をしてるんでしょ
とソースも読まず推測
0698デフォルトの名無しさん
垢版 |
2014/08/31(日) 21:04:00.35ID:da+aRwUf
>>697
でもソースを呼んでみたら、たとえば、wxListCtrl なんかは、
Win32 の LIST CONTROL をそのまま使っていた。
DrawRect()などで書いているわけではない。
ただし、wxGenericListCtrl だったかは、DrawRect()みたいなグラフィック
関数で独自に描画していた。が、それは、Windows版では簡単には使えない
という噂を聞いたが。
0699デフォルトの名無しさん
垢版 |
2014/08/31(日) 21:06:47.60ID:da+aRwUf
>>697
wxWidgets の基本設計は、Widgetは、OS nativeの物を使うが、
どんなサイズであっても対応できるように Sizer で Layout を
コントロールする、という物。

なので、抽象化はサイズと配置程度で済むはずなのだが・・・。
0700デフォルトの名無しさん
垢版 |
2014/08/31(日) 21:09:35.31ID:F1QgxQvq
>>696

>>697の言ってることが正しい。

---------------------
    wxWidgets
---------------------
Win32 | GTK | Cocoa etc...
---------------------

wxWidgetsは通常のGUI用ライブラリに一枚レイヤを重ねた形になるので
型情報・関数テーブルの情報だけで結構容量食う

>>692
ASCIIモードでビルドするのはやめておいたほうがいい
日本語使えないし

というかなぜMonolithicビルドにこだわるのか…
普通にconfigureからビルドしてdllごと配布したほうが立ち上がりは早い
0701デフォルトの名無しさん
垢版 |
2014/08/31(日) 23:57:56.42ID:da+aRwUf
wxWidgets の samples で ListCtrl 関連を見てみたが、ヘッダを
ドラッグしようとしてもドラッグできないので、ドラッグによる列の入れ替
えは出来ないようだった。

実は、Win32 の LIST CONTROL は、

・マウスドラッグによる自動的な列の入れ替えをした際、どこにどの列が
 行ったかを掌握するには注意が必要。動作を知るには基本的に実験を必要
 とする。
・第1カラムを削除すると第2カラム以降を削除した時とは同じとは言えない
 奇妙な動作をする。奇妙な動作と言ったがバグに近い。

こういった辺りがどう処理されているか知りたかったのだが、サンプルでは
故意か偶然か、全くそこに触れていないようだった。
0702デフォルトの名無しさん
垢版 |
2014/08/31(日) 23:59:28.64ID:da+aRwUf
wxWidgets の samples で ListCtrl 関連を見てみたが、ヘッダを
ドラッグしようとしてもドラッグできないので、ドラッグによる列の入れ替
えは出来ないようだった。

実は、Win32 の LIST CONTROL は、

・マウスドラッグによる自動的な列の入れ替えをした際、どこにどの列が
 行ったかを掌握するには注意が必要。動作を知るには基本的に実験を必要
 とする。
・第1カラムを削除すると第2カラム以降を削除した時とは同じとは言えない
 奇妙な動作をする。奇妙な動作と言ったがバグに近い。

こういった辺りがどう処理されているか知りたかったのだが、サンプルでは
故意か偶然か、全くそこに触れていないようだった。
0703デフォルトの名無しさん
垢版 |
2014/09/01(月) 00:00:47.70ID:X69OanmZ
>>700
>wxWidgetsは通常のGUI用ライブラリに一枚レイヤを重ねた形になるので
>型情報・関数テーブルの情報だけで結構容量食う

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

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

8bit時代、16bit時代を知る人にとって、Widget 程度が64KBを超える
事があってはならない。どういうプログラミングをしたら2MBにもなる
のか。
0705デフォルトの名無しさん
垢版 |
2014/09/01(月) 01:16:10.03ID:7Pg7L2PA
>>703
>>704
一理あるのでちょっとメーリングリストを探ってみたり
まず、wx/wx.hがいろいろなヘッダファイルを事前にincludeしているので
それがバイナリサイズの増加の一因になっているらしい

[wxMSW]: why EXE-files are so large?
https://groups.google.com/d/msg/wx-users/psTmm3nB6AU/9j6-4ir95-gJ
0706デフォルトの名無しさん
垢版 |
2014/09/01(月) 07:25:22.06ID: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
を追加しただけ。
0708 【大吉】
垢版 |
2014/09/01(月) 07:40:36.83ID:zQucGkuf
wxWidgets の samples で ListCtrl 関連を見てみたが、ヘッダを
ドラッグしようとしてもドラッグできないので、ドラッグによる列の入れ替
えは出来ないようだった。

実は、Win32 の LIST CONTROL は、

・マウスドラッグによる自動的な列の入れ替えをした際、どこにどの列が
 行ったかを掌握するには注意が必要。動作を知るには基本的に実験を必要
 とする。
・第1カラムを削除すると第2カラム以降を削除した時とは同じとは言えない
 奇妙な動作をする。奇妙な動作と言ったがバグに近い。

こういった辺りがどう処理されているか知りたかったのだが、サンプルでは
故意か偶然か、全くそこに触れていないようだった。
0709デフォルトの名無しさん
垢版 |
2014/09/01(月) 07:45:41.49ID: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 を動的リンクするための
呼び出し部分だけを提供する小さなライブラリ。
0711デフォルトの名無しさん
垢版 |
2014/09/01(月) 14:09:14.38ID: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)
0712デフォルトの名無しさん
垢版 |
2014/09/01(月) 14:13:21.84ID: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 のサイズ
が変わって来ても不思議は無い。これは驚くべきことである。
0714デフォルトの名無しさん
垢版 |
2014/09/01(月) 16:14:53.94ID:X69OanmZ
>>713
コンパイルオプションまで変えてしまって何をやっているかと言うこと
なんだよ。ライブラリの集め方だけの問題じゃないって事なんだ。

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

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


また、最終EXEが大きくなる理由として、アプリが使ってないオブジェクトを
非常に基本的なライブラリの一部が参照している可能性がある。
そしてそのオブジェクトが別のオブジェクトを勝手に参照して・・・という
事が続いて最終EXEのサイズが肥大化してしまっているのかも知れない。
0717デフォルトの名無しさん
垢版 |
2014/09/01(月) 17:12:16.45ID:bPa0tOdz
このライブラリを使うなとなる。
0719デフォルトの名無しさん
垢版 |
2014/09/02(火) 13:46:25.35ID:TmMSlGm8
configure を試してみたら、configureのヘルプ通りには行かなかった:

・以下、xxx = wxWidgets-2.8.12 とする。/xxx/ に configure スクリプトがある。

・configureを使用するために、単なるcmd.exeではなくcygwin環境が必要であった。

・cygwinを起動する際、cygwin に入ってからの PATH が、
 (MinGWのbin) : /usr/local/bin/ : /usr/bin/ : (Winからのbin)
 の順になるようにした。

・カレントを /xxx/ にして configure した。configure の引数には少なくとも

・--build=i686-pc-mingw32 --host=i686-pc-mingw32 --target=i686-pc-mingw32
 を指定し、例外, rtti, regex, zlib, jpeg, png, tiff は無効にするオプション
 を設定した。他にも無効にしたものも多い。大量に及ぶので スクリプトに記述した。

・Makefileが普段の /xxx/build/msw/ ではなく、/xxx/ に作られた。

・/xxx/samplesのサブディレクトリにあるMakefileが書き換えられた。

・setup.h が、
 /xxx/lib/wx/include/msw-ansi-releasw-static-2.8/wx
 /xxx/lib/wx/include/msw-ansi-releasw-2.8/wx
 の二箇所に作成された。元々各所にあるが、例としては
 /xxx/include/ws/msw や /xxx/lib/gcc_lib/msw/wx にある。 

・/xxx/ で make[ret] してみた。

・途中で例外を有効にするように言われたので有効にした。
0720デフォルトの名無しさん
垢版 |
2014/09/02(火) 13:46:50.57ID:TmMSlGm8
・regex, zlib, jpeg, png, tiff は全て無効にしていたにも関わらず、
 src/regex, src/zlib, src/jpeg, src/tiff にしかない *.h ファイルが見つから
 ないエラーとなった。。
 そこで、Makfileを直接修整して、CPPFLAGS に -I 指定によって、上記ディレクトリ
 を最後尾に追加した。

・make には成功した。

・/xxx/ に大量の *.o ファイルが作られ、*.a は /xxx/lib/ に作られた。
 /build/msw から make した場合は、/xxx/lib/gcc_lib に作られるのと対照的
 である。

・/xxx/samples/console で make してみたら、成功した。

・「プロシージャエントリポイント _gxx_persolanity_v0 が
  ダイナミック リンク ライブラリ libstdc++-6.dll から見つかりませんでした。」
  のメッセージボックスが出て起動できず。

・Makefileを書き換えて、LIBS の最後に -lstdc++ を書いても症状は治まらない。
0721デフォルトの名無しさん
垢版 |
2014/09/02(火) 13:48:11.36ID:TmMSlGm8
・regex, zlib, jpeg, png, tiff は全て無効にしていたにも関わらず、
 src/regex, src/zlib, src/jpeg, src/tiff にしかない *.h ファイルが見つから
 ないエラーとなった。。
 そこで、Makfileを直接修整して、CPPFLAGS に -I 指定によって、上記ディレクトリ
 を最後尾に追加した。

・make には成功した。

・/xxx/ に大量の *.o ファイルが作られ、*.a は /xxx/lib/ に作られた。
 /build/msw から make した場合は、/xxx/lib/gcc_lib に作られるのと対照的
 である。

・/xxx/samples/console で make してみたら、成功した。

・「プロシージャエントリポイント _gxx_persolanity_v0 が
  ダイナミック リンク ライブラリ libstdc++-6.dll から見つかりませんでした。」
  のメッセージボックスが出て起動できず。

・Makefileを書き換えて、LIBS の最後に -lstdc++ を書いても症状は治まらない。
0722デフォルトの名無しさん
垢版 |
2014/09/02(火) 16:41:02.66ID:TmMSlGm8
console.cpp の中身を printf() だけを使う4行の main() 関数だけに
書き換えてみたら問題なく起動して普通に文字列が表示された。

なので、MinGW 環境の問題ではなさそう。
0723デフォルトの名無しさん
垢版 |
2014/09/02(火) 17:12:10.67ID:TmMSlGm8
wxPrintf()だけを使った console 版 hello world が、static link
で 96,468 bytes で済んだ。

ところが、wxString を使った場合、作成した exe を実行しようとすると
>>721 後半で書いたメッセージ・ボックスが出て起動できない。
0725デフォルトの名無しさん
垢版 |
2014/09/02(火) 17:44:29.48ID:TmMSlGm8
>>724
ダイナミックライブラリであるところの
 libstdc++-6.dll
は既に読み込めているんですわ。
「libstdc++-6.dll から見つかりませんでした。」
の「から」がそれを表している。

なお、configureを使わずに、build/msw から build したライブラリだと
wxStringとwxPrintfだけを使ったconsoleアプリは、静的リンクでも
451,584 バイトで済むことが判明。こちらはちゃんと起動できる。
0726デフォルトの名無しさん
垢版 |
2014/09/02(火) 19:04:52.66ID:DoCZo715
パスが通ったところに互換性のない別バージョンのdllがあるんだろ。
mingwだとsjljとdw2の2種類あるから。
0727デフォルトの名無しさん
垢版 |
2014/09/02(火) 19:56:42.14ID:TmMSlGm8
MinGW/bin を

i686-pc-mingw32-g++ と MinGW/bin/g++ は別物らしくコンパイラのサイズ
(作ったプログラムのサイズではなく変換機のサイズ)がそもそも違う。

また、前者では、リンク段階で何もエラーを出さないが、
後者では、ちゃんと、_gxx_persolanity_v0 や _Unwind_Resume が
undefined reference というエラーになる。
0728デフォルトの名無しさん
垢版 |
2014/09/02(火) 20:00:33.47ID:TmMSlGm8
>>726
最初、xxx dw2 yyy.dll が見つからない、と言うメッセージ・ボックス
が出たのだが、そのdllを検索すると MinGW/bin にある事が分かって、
そこにパスを通したらそのメッセージ・ボックスは出なくなった。

その代わりに >>721 のメッセージ・ボックスが出るようになった。
0729デフォルトの名無しさん
垢版 |
2014/09/02(火) 20:55:48.58ID:TmMSlGm8
結論的に言うと、自分のローカルにMinGW32 の別バージョンが沢山あった。
サンプルのコンパイルに使われたのと同じMinGW32のbinだけをパスに
設定してからサンプルを起動すると実行できるようになった。
実行結果も問題ない。実行ファイルはstripするとサイズが小さくなったが、
>>691のライブラリをリンクした物よりも大きくなってしまった。

[wxStringを使った最小な cui program のサイズ]

>>691 のwxライブラリ使用時 : 451,584 bytes
 コンパイラは CodeBlocks付属のMinGW

・configureしたwxライブラリ使用時 : 547,342 bytes
 コンパイラは cygwinにインストールしたMinGW

[wxFrameを使った最小な gui program のサイズ]

>>691 のwxライブラリ使用時 : 1,611,264 bytes
 コンパイラは CodeBlocks付属のMinGW

なお、今回は、>>719-720 のような不具合を回避するため、RegExや、png,jpeg,tiff,zlib
などはconfigureで有効にしておいた。そうすると>>720の最初のヘッダファイル問題は
消えたので、何か良いことがあるかと思ったから。ただし、様子を見るとそれは必要なかった
かも知れない。サイズ縮小のためには disable にすべきかも。
0730デフォルトの名無しさん
垢版 |
2014/09/02(火) 21:12:01.59ID:WV3CuJcS
よかったな
-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
にすればlibstdc++とスタティックリンクできるかもな
0731デフォルトの名無しさん
垢版 |
2014/09/02(火) 22:46:11.97ID:TmMSlGm8
cygwin版のMinGWと、cmd.exe 版のMinGWって結構違うような気がしてきた。
Makefileなんかもcygwin版だと/cygdrive/c/xxx/yyy/zzz の形式になっている
のに対し cmd.exe版は c:\xxx\yyy\zzz になっているらしい。
また、コンパイラに -I 指定したパスなんかも同様の違いがあるらしく、
configureが作ったMakefileは、cygwin版MinGW用で、
cmd.exe版のMinGWでは、#inclde "wx/setup.h" のパスが探せなかったり
する。

build, host, target の指定は、全て mingw を指定していたのだから、
cygwinが入り込む余地は無かったはず。これは、configure.inか、
Makefileのどちらかを自前で修整する必要がありそう。

さらに、makeが(?)
process_begin: CreateProcess(NULL, sh xxxxxx, ...) failed.
というエラーを出すことがあり、その原因を探る必要もある。
0733デフォルトの名無しさん
垢版 |
2014/09/02(火) 22:56:38.09ID:TmMSlGm8
cygwin版のMinGWと、cmd.exe 版のMinGWって結構違うような気がしてきた。
Makefileなんかもcygwin版だと/cygdrive/c/xxx/yyy/zzz の形式になっている
のに対し cmd.exe版は c:\xxx\yyy\zzz になっているらしい。
また、コンパイラに -I 指定したパスなんかも同様の違いがあるらしく、
configureが作ったMakefileは、cygwin版MinGW用で、
cmd.exe版のMinGWでは、#inclde "wx/setup.h" のパスが探せなかったり
する。

build, host, target の指定は、全て mingw を指定していたのだから、
cygwinが入り込む余地は無かったはず。これは、configure.inか、
Makefileのどちらかを自前で修整する必要がありそう。

Makfileの / を \ で置換して、/cygdrive/x/ を x:/ にしてみたら結構
行ける。途中、pch でファイルにアクセス拒否で書き込めないと言われるが、
もう一度 make すると、何事も無かったように続行する。
0735デフォルトの名無しさん
垢版 |
2014/09/02(火) 23:40:17.26ID:wgXgojMH
作ったバイナリのサイズなんてwxWidgetsのビルド方法によって大きく変わるうえ、
最終的に使い物にならないライブラリの出来上がりとなるのが目に見えている
本当に必要なものだけを炙り出すつもりなら止めはしないが、どう考えても徒労でしかないと思うぞ
0736デフォルトの名無しさん
垢版 |
2014/09/02(火) 23:47:28.37ID:r9jqoPj2
正直wxWidgetsのバイナリサイズの話以外はほとんど既出だし
CygwinとMinGWの仕様の違い、クロスコンパイラのターゲット、configureの基本
それらの件に関しては自分のブログにでも書いていてほしい
0737デフォルトの名無しさん
垢版 |
2014/09/02(火) 23:54:47.98ID:r9jqoPj2
まあ一応上から目線でコメントしとくと

>>725
libgccの存在に関して勉強不足、>>726の言うとおりdllの種別が2種類ある
DLLにするよりもlibgccだけスタティックリンクしたほうがいいが、libtoolにかませるのが
割と面倒なので一緒に配布したほうが楽、まぜこぜにするとか初心者くさい

>>727
クロスコンパイラとネイティブコンパイラを混同している

>>731
もうネット上で一万回は言及されたであろうCygwinとMinGWのファイルパスについて
述べているが無駄なのでやめてほしい、てか環境を混ぜるな
0738デフォルトの名無しさん
垢版 |
2014/09/03(水) 00:12:32.54ID:RSu3l9Ti
>>737
最後の段落について。

・cygwin版のMinGW ---> ファイル名はUnixライクな /cygdrive/c/xxx/yyy/zzz 形式だが、
             出来た実行ファイルはcygwinが無くても動作する。
             ユーザー・プログラムからは主にWin32 APIを使う。

・cmd.exe版のMinGW ---> 何もかも Windows 用。ファイル名もDOS式、
             出来た実行ファイルは Windows のみで動作。
             ユーザー・プログラムからは Win32 API を使う。

・cygwinのgcc    ---> cygwin環境で動く実行ファイルを作成する。
             ユーザー・プログラムからはUnix系関数を使う。
0739デフォルトの名無しさん
垢版 |
2014/09/03(水) 00:20:01.40ID:qMd+w6/O
>>738
スレ違いだ、こっちでやれ
Cygwin + MinGW + GCC 相談室 Part 7
http://peace.2ch.net/test/read.cgi/tech/1357019230/

あとMinGWはcmd.exeではなくminttyから使うべきだ
さっさとネットで資料を探す作業に戻るんだな
0740デフォルトの名無しさん
垢版 |
2014/09/03(水) 00:37:00.57ID:kYvXCnau
ちなみに c:\cygwin\bin と c:\cygwin\usr\local\bin にパスを通せば、
cmd.exe からでも cygwin のコマンドが実行できるようになる。
gccもlsもmakeも。ここでbashを起動すればcygwin環境になる。
0742デフォルトの名無しさん
垢版 |
2014/09/03(水) 14:50:56.74ID:kYvXCnau
wx のソースを修正したら、wxString() を使った最小サンプルが、
静的リンクしても 70KB で済むようになった。

PATHには、MInGW/bin しか設定せずにテストしているので、wx の DLL
がリンクされている可能性は無く、間違いなくスタンド・アローンの
プログラム。

ちなみに、wx のソースを修正しなければ、451,584 バイトになってしまう。
>>729 に書いたものとほぼ同じプログラムだから。
0751デフォルトの名無しさん
垢版 |
2014/09/05(金) 15:46:20.79ID:JjYqHkIR
公園の蚊を駆除するのに外側からじゃなくて内側から始めるとかが無駄
自分にも危害が及ぶので嫌
0752デフォルトの名無しさん
垢版 |
2014/09/05(金) 17:37:07.79ID:MynIP2yf
>>749>>750
言われた側が一方的に立場が悪くなるという効能は興味深いと思う
言ったもん勝ちという現象は絶対にあるのだ
>>751
生死にかかわる難しい判断を
「無駄なこと」に無理やりおしこめた詭弁
物事を矮小化させる効果もある
0753デフォルトの名無しさん
垢版 |
2014/09/05(金) 18:18:43.88ID:NH0YjWIH
>>751
正直言って、今回のこととの関連も分からない。
それ以前に外側から、内側から、ということの意味が全く分からない。
まるで会話ロボットが生成した文書のようだ。

>>752
この文書も意味不明。人間が書いたとは思えない全く理解できない文書だ。
0754デフォルトの名無しさん
垢版 |
2014/09/05(金) 22:33:12.96ID:Mt1E1+r6
俺の大好きなwxWidgetsスレがめちゃんこ糞スレになって泣きそう
0756デフォルトの名無しさん
垢版 |
2014/09/10(水) 10:22:55.86ID:8Y3LAJyJ
wxWidgets って、GTK をバックエンド(port to)に使うことも出来るらしい
ね(wxGTK)。

上位のツールキットが、下位のツールキットに被さっているってことか。

X11 を直接バックエンドに使うのともまた違うのかな?
0757デフォルトの名無しさん
垢版 |
2014/09/10(水) 18:37:52.75ID:/KH51cxp
      \       ヽ           |        /        /
          \      ヽ               /      /
‐、、         殺 伐 と し た ス レ に 鳥 取 県 が ! !      _,,−''
  `−、、                  __/\            _,,−''
      `−、、              _|    `〜┐         _,,−''
                      _ノ       ∫
                  _,.〜’        /
───────‐     ,「~             ノ    ───────‐
               ,/              ` ̄7
                |     島 根 県     /
           _,,−'   ~`⌒^7            /    `−、、
        _,,−''            丿            \,      `−、、
 ,'´\           /  _7       /`⌒ーへ_,._⊃         /`i
 !   \       _,,-┐    \    _,.,ノ          r‐-、、      /   !
 ゙、   `ー--<´   /      L. ,〜’             ゙、  >−一'′   ,'
  y'  U      `ヽ/     /            ヽ      ヽ '´     U   イ
                                ____
         /      __        |       \____\
    ___/__ / ̄    ____|____ \ \____\
       //ヽ   /___         /|\       \ \____\
     / / ヽ  / /__     /  |  \       \_______
   /  /   / /   /     /    |    \          |    \
  /   /  / /  _/   __/      |      \__      |     \  ̄―_
0758デフォルトの名無しさん
垢版 |
2014/09/11(木) 00:33:29.51ID:na3nzgh2
>>756
X11は組み込み向けのportなので一般的には使われないよ(メンテされてるかもよくわからん)
Linuxでの使用の際はGTKベースと思っていた方がいい
つまりwxWidgetsのクラスやメソッドでコードを書いてLinux上でビルドするとGTKアプリができる

最近はwxQtというwxWidgetsからQtをバンドルするイカれたプロジェクトが本流にマージされたようだが…
0760デフォルトの名無しさん
垢版 |
2014/09/11(木) 20:49:49.06ID:na3nzgh2
>>759
目的は、Qtベースのデスクトップ(KDE)でもwxWidgetsアプリを使うためとか
(→まあKDE上でGNOMEアプリを使うツールもあった気がするのだが…)
あとQtをバンドルすることでAndroid対応も果たしていた(実用性は不明)
0761デフォルトの名無しさん
垢版 |
2014/09/12(金) 10:47:54.87ID:w24nfmYL
wxWidgetsで、POPUP Menu (Windows では、Context Menu が正式名称かも)を作る場合、
どうしてますか?

特に、CodeBlocksなどのIDEで行う場合の最良の作法が知りたいです。
自分は、基本的な wxSmith の使い方が分かったところです。
0763デフォルトの名無しさん
垢版 |
2014/09/12(金) 11:47:23.49ID:S8WOzChk
>>762
それは手作業の場合ですよね。
そこの部分は対した手間ではないですが、
イベント・ハンドラを*.cpp, *.h, EVENT_TABLEの全てに書くのが面倒で。
0765デフォルトの名無しさん
垢版 |
2014/09/12(金) 12:20:43.41ID:k4huCAJU
>>764
これ、今ちょうど数秒前に見終わったところだった。

これ見てると、

1. wxSmithでwxFormをエディット中に、「MenuBar」ではなく「Menu」ボタンを押して
 「要素」を追加する。
  そうするとwxSmithの上辺に要素のアイコンが並んでいる末尾に新しいアイコンが追加される。
2. 追加したMenu要素に名前を付ける。
3. wxFormの中に既に配置してあったwxPanelに対して、マウス右UPイベントに対応するハンドラを追加する。
4. そのハンドラの中に、手作業で PopupMenu()関数の関数呼び出しを書き、
  その引数に2.でMenuに付けおいた名前を書く。

こここまでは大した手間じゃない。

その後が問題で、EVENT_TABLE の「自動的にwxSmith が作成する範囲」の外側(直後)に、
POPUP MENUのMENU項目数分だけ、手作業で Connect() 関数を書いている。メニュー項目が7個だと、
Connect()関数も7個書く。それぞれ、MENU項目に付けた ID_xxxx の値と、対応する自前の
イベント・ハンドラの関数名を引数に指定して。


最後の部分が知りたかった事で、POPUP MENUの作り方としてはかなり面倒な方法に属する。
0767デフォルトの名無しさん
垢版 |
2014/09/12(金) 14:27:34.99ID:8yVPY0Zt
7個のメニュー項目にイベント結びつけるのに7行コード書くのって、そんな突出して面倒か?
0768デフォルトの名無しさん
垢版 |
2014/09/12(金) 15:27:57.79ID:mqgnzDe4
>>767
それは、「EVENT_TABLE」の箇所だけの話で、実際は、*.h に
メンバ関数宣言を7つ書き、*.cpp に
Zzzz Ccccc::OnXxxxx( Yyyy *pYyyy )
{
return Qqqqq;
}
みたいなの(4行)を 7 つ書く必要がある。

少なくとも (1+1+4)*7 = 42 行だ。
レスを投稿する


ニューススポーツなんでも実況