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 使おう。