ページ

2014年6月7日土曜日

Xcode 5 でwxWidgetsアプリのビルド

前回のエントリでwxWidgetsのこれでようやくwxWidgetsを使ってアプリケーションを開発することが出来る.サンプルコードのようにMakefileでビルドするのも悪くないのだけど,私はコマンドラインデバッガをまともに使えないので,やはりアプリの開発はXcodeでやりたい.

まずはプロジェクトの新規作成.テンプレートはOS X ApplicationのCocoa Applicationを選択する.

プロジェクトが作成されたら,以下の2個以外の構成ファイルを全部削除する.

  • (プロジェクト名)-Info.plist
  • main.m


main.mをmain.cppに変更して,Objective-Cの文法を全部消す.

ここからBuild Settingsにいくつかの設定をしなければないが,毎回やるのが面倒なので,以下のような設定ファイルを記述した.私はこの設定ファイルをwxWidgetsのインストールディレクトリに置いておき,新しくアプリを作るときにコピーして使っている.

mywx.xcconfig

WXTOOLKIT = cocoa
WXTOOLKITUPPER = COCOA
WXROOT = /Users/USERNAME/Develop/wxWidgets-3.0.0
HEADER_SEARCH_PATHS = $(inherited) $(WXROOT)/lib/wx/include/osx_cocoa-unicode-static-3.0 $(WXROOT)/include/wx-3.0LIBRARY_SEARCH_PATHS = $(inherited) $(WXROOT)/lib
GCC_PREFIX_HEADER = $(WXROOT)/include/wx-3.0/wx/wxprec.h
GCC_PRECOMPILE_PREFIX_HEADER = YES
MACOSX_DEPLOYMENT_TARGET = 10.7
ARCHS = i386 x86_64
GCC_PREPROCESSOR_DEFINITIONS = $(WX_PREPROCESSOR_DEFINITIONS) __WX__ __WXMAC_XCODE__=1 __WXOSX_COCOA__ wxUSE_BASE=1 WX_PRECOMP=1 wxUSE_UNICODE_UTF8=0 wxUSE_UNICODE_WCHAR=1 _FILE_OFFSET_BITS=64 _LARGE_FILES SCI_LEXER
CLANG_CXX_LIBRARY = libstdc++
OTHER_LDFLAGS = -framework WebKit -framework IOKit -framework Carbon -framework Cocoa -framework AudioToolbox -framework OpenGL -framework QTKit -lz -liconv -lwx_baseu-3.0 -lwx_baseu_net-3.0 -lwx_baseu_xml-3.0 -lwx_osx_cocoau_adv-3.0 -lwx_osx_cocoau_aui-3.0 -lwx_osx_cocoau_core-3.0 -lwx_osx_cocoau_gl-3.0 -lwx_osx_cocoau_html-3.0 -lwx_osx_cocoau_media-3.0 -lwx_osx_cocoau_propgrid-3.0 -lwx_osx_cocoau_qa-3.0 -lwx_osx_cocoau_ribbon-3.0 -lwx_osx_cocoau_richtext-3.0 -lwx_osx_cocoau_stc-3.0 -lwx_osx_cocoau_webview-3.0 -lwx_osx_cocoau_xrc-3.0 -lwxpng-3.0 -lwxregexu-3.0 -lwxscintilla-3.0 -lwxtiff-3.0


さて,mywx.xcconfigをプロジェクトにコピーする.そしてプロジェクトのConfigurationsにmywx.xcconfigを適用する.

どうもmywx.xcconfigだけでは設定しきれない箇所があるので,TargetのBuildSettingsを手動で設定する.

まずPrefix Headerの設定から,最初に削除した(プロジェクト名)-Prefix.pchファイルの設定を削除する.

次に,C++ Standard Libraryをlibc++に変更する.

さて本来ならここでビルドが通るべきだと思うのだが,ビルドしてみると,config_xcode.hがないとかいうエラーが出る.探してみると,wxWidgetsをダウンロードして展開したディレクトリのinclude/wx/osx/の中にこのファイルがあるようだが,インストールディレクトリにコピーされていない.よくわからないけど,このファイルを手動でインストールディレクトリのinclude/wx-3.0/wx/osx/にコピーしてしまった.

以上の設定で,ようやくビルドが通った.mywx.xcconfigだけで設定しきれない部分も結構あるので,Xcodeプロジェクトのテンプレートにできると良いのだけど,やり方がいまいちよくわからないのでとりあえず保留.まぁ手作業でやっても慣れれば1分もかからないだろう.

あとはwxWidgets tutorial(http://zetcode.com/gui/wxwidgets/)などをやってみると,基本的なだいたい使い方がわかる.



Max OS X 10.9 (Mavericks)でwxWidgets

概要

目標


  • wxWidgetsのMac OS X用静的リンクライブラリを作る
  • ターゲット環境は以下の通り
    • CPUアーキテクチャ : Intel Mac (32bit/64bitユニバーサルバイナリ)
    • 最低動作OSバージョン: Mac OS X 10.7 (Lion)

ビルド環境


  • iMac 21.5-inch, Late 2009
  • Mac OS X 10.9 (Mavericks)
  • Xcode 5.1.1
  • Apple LLVM version 5.1


ダウンロードとconfigure

まずは公式サイトからwxWidgets 3.0.0のソースコードをダウンロードして(Source for Linux, OS X, etcってやつ),適当なディレクトリに展開した

ビルドには以下ページを参考にした(若干情報が古いものもある).



Xcodeを使ってビルドする方法もあるようだけど,4番目のページに
"Building wxWidgets using Xcode is generally less flexible and reliable than use the terminal."
とか書いてあるので,今回はconfigureでビルドすることにする.

configureは以下のように実行した.できれば1個の静的ライブラリにまとめられればスッキリするのだけど,--disable-sharedと--enable-monolithicは一緒に使うなと2番目のページに書いてあったので,--disable-sharedだけにしておく.

./configure --disable-shared --enable-unicode --with-osx_cocoa --enable-universal-binary=i386,x86_64 --with-macosx-version-min=10.7 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk --prefix=/Users/USERNAME/Develop/wxWidgets-3.0.0

後から知ったところによると,--enable-unicodeはデフォルトになっているらしいので,ここで明示的に指定する必要はなかったかも.

なおこの設定ではC++標準ライブラリとしてlibstdc++を使うようにビルドされるので,アプリでlibc++を使いたい場合は明示的にその設定を加える必要がある.

PowerPCのMacを相手にすることは今後恐らく無いので,--enable-universal-binary=i386,x86_64にしてある(i386さえ既に不要かもしれない),
--with-macosx-version-minは最低動作OSバージョン.--with-macosx-sdkはビルドに使うSDKで,基本的には現在Xcode.appの中に入っている最新のSDKを指定すれば良いと思う.--prefixは,wxWidgetsをインストールするディレクトリを指定する.これを明示的に指定しないとたぶん/usr/local配下に入ってしまって,複数バージョンの共存やアンインストールが難しくなる.私の場合は自分のホームディレクトリにDevelopというディレクトリを作ってあるので,その配下にwxWidgets-3.0.0というディレクトリを作って(予め作っておく必要がある)インストールすることにした.

ビルド

さてconfigureが完了したのでmakeしてみると,以下のようなエラーが出る.
./src/tiff/libtiff/tif_lzma.c:38:10: fatal error: 'lzma.h' file not found
#include "lzma.h"
./src/common/imagjpeg.cpp:45:14: fatal error: 'jpeglib.h' file not found
#include "jpeglib.h"

ググってみると,似たようなトラブルに遭遇している人がいる.
https://bugs.launchpad.net/kicad/+bug/1285317

要するに,homebrewでxzとlibjpegをインストールして,インクルードパスとリンクパスを通せば良いらしい.私の場合は既に両方インストール済みだったので,

export CFLAGS="$CFLAGS -I/usr/local/Cellar/xz/5.0.5/include"
export CFLAGS="$CFLAGS -I/usr/local/Cellar/jpeg/8d/include"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="$LDFLAGS -L/usr/local/Cellar/xz/5.0.5/lib"
export LDFLAGS="$LDFLAGS -L/usr/local/Cellar/jpeg/8d/lib"

のように環境変数としてパスを指定して,
./configure (オプションは上記の通り)

そして
make -j 2

このmakeにはかなり時間がかかることが試行錯誤しているうちにわかっていたので,-j 2オプションをつけて並列実行したのだけど,それでも30分ぐらいかかった.私のiMacがだいぶ古いせいかもしれない.

インストール

make install

すると,アプリ開発に必要なファイルが,configureの--prefixで指定したディレクトリにコピーされる.

念のため,libディレクトリ以下の静的バイナリがちゃんとUniversalバイナリになっているか確認.
lipo -info libwx_osx_cocoau_core-3.0.a

Architectures in the fat file: libwx_osx_cocoau_core-3.0.a are: i386 x86_64

うまくいったようだ.