なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

MacでwxWidgets

MacC++やるのはつらい。環境構築しにくい。以下手順。


環境はMac OSX Lion 10.7

開発環境を揃える

Command Line Tools for Xcodeをインストール

表題の通り、Apple Developerからダウンロードしてインストール。
これを入れるとUNIXコマンド系がひと通り /usr 以下に入って使いやすかった気がする。

MacPortからC++開発環境をインストール

The MacPorts Project -- Home
portsのインストールはどうやったか忘れた。

インストールした後、clang-mp-3.3, libtool, automake, autoconf, gsedあたりを入れる。

 # port selfupdate
 # port install clang-mp-3.3 libtool automake autoconf gsed

portで入るものは /opt/local 以下に入るので、パスを合わせる。

 $ vim ~/.bash_profile

+ alias ll='ls -l'
+ export PATH=$PATH:/opt/local/bin:/opt/local/sbin 

あと、通常のlibtoolはclangに対応していないはずなので /usr/bin/libtool があればリネームして使わないようにしておく。
portで入る /opt/local/bin/libtool を使用する。

2015/08/11 追記

たぶん今ならbrewで入れたほうがいいような気がする。まああんまり粘着質じゃないノンプログラマの人々はwxWidgets入れてから途方にくれそうな気がするが…

Emacsを入れる

X上でのEmacsはこれでいいでしょ。はい、ヨロシクぅ!
GNU Emacs For Mac OS X

国民が知らないMacOSXでのC++11の真実

詳しくは以下
http://mlucassmith.tumblr.com/post/8052052794/c-11-on-osx-is-a-mess

要は
GCCを使ってObjective-Cのプログラム(Cocoaのコードをインクルード)をコンパイルすることは不可能
Apple GCC 4.2.1は糞なので古いのでC++11をサポートしていない(デフォルトのコンパイラはこれだったと思う)
・Clang++はCocoaのコードをインクルードしてコンパイルできる、C++11のコードもまずまず使える

…どうもAppleGCCがGPLv.3であることを嫌っているようだ
しかもCocoaのコードにはGCCからのビルドをブロックする機構があるらしいGCCには解析できない文法を追加している(?)
Why Can't I Compile Objective-C/C++ (.mm) Files with MacPorts gcc-mp-4.6? - Stack Overflow

追記:ここでのBlocksとはObjective-Cで新たに追加された文法のことらしい。Perlでいう無名関数と同じようなものらしい。よかった、GCCが排除されたというわけではないんだね。

clang++での設定

clang++のMacPort版はC++11が結構使える。ただしコンパイル、リンク時にオプションを付加する必要がある。

詳しくは以下
"libc++" C++ Standard Library

とは言ってもやることは2つほどしかない。
C++11の機能を使いたい場合、コンパイルオプションに「-std=c++11」をつける
・stdc++で使っているような標準C++の機能を使いたい場合「-stdlib=libc++」をつける

だから、AutotoolsでC++11/libc++を使用する場合(他の環境では当然使えるはずなんですが…)以下のようになる

  CC       = 'clang-mp-3.3'
  CXX      = 'clang++-mp-3.3'
  CXXFLAGS = '-std=c++11 -stdlib=libc++'

で、このコンパイルフラグを使わないとC++ポケリに書いてあるようなことがまっっったく使えないんですよ。
std::wstringがundefined referenceになるのはさすがにわろた。

C++ ポケットリファレンス

C++ ポケットリファレンス

wxWidgetsC++11, libc++付きでビルド

最後、ようやくwxWidgetsのビルドができる。手順は以下

参考にしました、ありがとうございます
Bash - wxWidgets 2.9.3 を C++11 としてコンパイルする (Mac OS X 10.7 Lion) - Qiita

# git clone https://github.com/wxWidgets/wxWidgets.git
# cd wxWidgets
# ./configure CXXFLAGS="-stdlib=libc++ -std=c++11 -DHAVE_TYPE_TRAITS" OBJCXXFLAGS="-stdlib=libc++ -std=c++11" \
  CPPFLAGS="-stdlib=libc++" LDFLAGS="-stdlib=libc++" CXX=clang++-mp-3.3 CXXCPP="clang++-mp-3.3 -E"            \
  CC=clang-mp-3.3 CPP="clang-mp-3.3 -E" --enable-unicode --enable-debug --enable-gdb-debug                    \
  --with-macosx-sdk=/Developer/SDKs/MacOSX10.7.sdk --with-macosx-version-min=10.7 --with-cocoa                \
  --with-libjpeg=builtin --with-libpng=builtin --with-regex=builtin --with-libtiff=builtin                    \
  --with-zlib=builtin --with-expat=builtin --enable-std_containers --enable-std_iostreams --enable-std_string
# make && make install

なぜ最新版をビルドしているかというと、wxWidgets-2.9.4ではアプリケーション起動時にwxCSConvでこけて突然死するバグがあったからだ。wxTracにて報告したら、もう直っていた。

終わり

ここまでで手順終わり
あ^〜、疲れるんじゃ^〜