wxWidgets 2.9.3 を C++11 としてコンパイルする (Mac OS X 10.7 Lion)

More than 3 years have passed since last update.

wxWidgets を静的リンクしたいけども、アプリケーション側では C++11 (libc++) を使いたくて、そうすると wxWidgets もそれにうまく対応させてコンパイルしないとダメだよね、という話。予想外に苦労したのでここに顛末をメモっておきます。 clang のバージョンは 3.0 です。

結論から言うと、 configure する際に以下の指定で出来た:

./configure CXX="clang++ -std=c++0x -stdlib=libc++ -DwxNO__T -DHAVE_TYPE_TRAITS -Dfinite=isfinite" \

--enable-unicode --enable-debug --disable-shared --disable-webview --with-opengl --with-macosx-sdk=/Developer/SDKs/MacOSX10.7.sdk --with-macosx-version-min=10.7 --with-cocoa

以下解説:



  • CXX="clang++ -std=c++0x -stdlib=libc++: コンパイラと言語モード、標準ライブラリの指定。 CXXFLAGS とかにオプションを指定しなかったのは、 CXXFLAGS を一部無視してビルドする箇所があったため。あと LDFLAGS に -stdlib=libc++ を指定してしまうと、 C コンパイラを使った時にもそれが使われてしまい、 configure が失敗する。


  • -DwxNO__T: wxWidgets の _T が C++ 標準ライブラリ中の _T とコンフリクトしてしまうので、 wxWidgets 側で _T を定義しないようにする。


  • -DHAVE_TYPE_TRAITS: C++11 の type_traits ライブラリを使わせるため。これはこっちで指定しなくても定義されていてよいものだと思うのだが。 (やっぱりこの指定要らないかもしれない)


  • -Dfinite=isfinite: clang は C++11 モードでないときは finite 関数、 C++11 モードの時は isfinite 関数を使わなければいけないが、 wxWidgets がそれに対応していないので、超その場しのぎで置き換えた。


  • --disable-webview: webview 周りはコンパイルできません。 Objective-C の id 型が struct objc_object * 型であること前提に組まれているコードがあるため。直す気もなかったし webview は今回使わなさそうだったのでスキップ。


  • --with-macosx-sdk=/Developer/SDKs/MacOSX10.7.sdk --with-macosx-version-min=10.7: libc++ があるのは Lion (と iOS5) からだけです。


  • --with-cocoa: Cocoa 使おう。