2009年5月5日

sconsでwxWidgetを使ってみた on windows


クロスプラットフォームなGUIライブラリwxWidgetsを使ったプログラムのビルドをsconsでやってみた。



環境


  • Windows XP SP3

  • Python2.6.1

  • SCons 1.2.0

  • wxWidgets 2.8.9

  • Visual C++ 2008 Express Edition

  • Windows SDK 6.1




リンクするライブラリが多いです。
wx-config使えばいいんだろうけど、parseConfigでの\がエスケープシーケンスになってしまうので、いまいち。
どうしてWindowsは\で区切るの?



まあ、そのままだと、windows.hとかkernel32.libとかそれぞれのサーチパスに入ってないっぽいので、色々準備が必要。


とりあえずWindows SDKは入ってるのでそちらを使うことにする。
さらに、wxWidgetsはマルチスレッドでコンパイルされてるので、リンクするライブラリもそのあたりのやつを指定しとかないと、不可解なエラーが出る。
今回はwxWidgetsをVC2008EEでコンパイルしたので、msvcprt90をリンクさせれば良さそう。


SConstruct

cpppath = []
libpath = []
libs = []

#wxwidgets
cpppath += [r'C:\wxWidgets-2.8.9\lib\vc_lib\mswu',
r'C:\wxWidgets-2.8.9\include']
libpath += [r'C:\wxWidgets-2.8.9\lib\vc_lib']
libs += 'comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib'.split()
libs += ['wxmsw28u_core', 'wxbase28u', 'wxpng', 'wxtiff', 'wxjpeg', 'wxzlib']

#win32
cpppath += [r'C:\Program Files\Microsoft SDKs\Windows\v6.1\Include']
libpath += [r'C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib',
r'C:\Program Files\Microsoft Visual Studio 9.0\VC\lib']
libs += Split("""
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
comctl32.lib rpcrt4.lib wsock32.lib winmm.lib
""")


env = Environment()
env.Append(CPPFLAGS=['/EHsc'])
env.Append(CPPFLAGS=['/MD'])
env.Append(CPPDEFINES=['UNICODE', '_UNICODE'])
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
env.Program('diary', ['main.cpp', 'mainwindow.cpp', 'document.cpp'],
LIBPATH=libpath, CPPPATH=cpppath, LIBS=libs)


こなれてない部分


  • wxWidgetsのベースフォルダは環境変数から拾ってこれるはず

  • Windows SDKのベースフォルダも拾ってこれないだろうか

  • Environmentに設定するのとProgramの引数で指定するのが混在しているのが気になる

  • wxWidgetsが必要としているlibは多すぎる。なんとかwx-configを使えるようにしたい


Qtにはqmakeがあるけど、さてどちらの方が使いやすいかな。