クロスプラットフォームな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があるけど、さてどちらの方が使いやすいかな。
|