気付けば冬ですが、けいなです。
今回はC++に関して試行錯誤したことについて書きます。
お気楽参加のTopCoder SRMやAtCoder、絶賛放置中のAOJではJavaを使いです。
C++は随分前に手を出そうとして環境構築との戦いに負けて放置していました。
(高校ではポインタと構造体の無いC言語と簡単なBorland C++だった筈なのに)
とある事情によりC++に軽く触れておかなければならなくなったので、
環境構築をしたのですが前回と同様に痛い目にあったので少しまとめておきます。
TopCoder SRMでEclipse上のEclipseCoderに頼りきりな人です。
当然、C++もまずはEclipseで、と考えました。
#include <iostream>
using namespace std;
int main(){
cout << "Hello World!\n";
return 0;
}
なんの変哲もないHello Worldを打ち込んでプロジェクトをコンパイルして実行…したところターミナルになにも出力されない。
調べるとEclipseとMinGWの組み合わせで、64bitの時に生じるバグのよう。
リンカのオプションに-staticを渡してやると直ることが分かったのでプロジェクトのプロパティから適当に挿入して解決。
前に嵌ったのはこれだったので前回は調査不足だったということですね、残念。
次に、適当にテストケースを放り込むものをEclipseCoderのC++で生成されるものを流用して使うことに。
で、何も考えずに次のようなコードを書いてコンパイルできずに死亡。
vector<int> expected_ = { 0, 13};
C++11で導入された記法らしいということに辿り着くまでにすこしかかったもののたどり着いてからは早く。
コンパイラのオプションに-std=c++11を渡してやるとコンパイル通るので適当に。
が、この環境を構築したWindows 8はバッテリーの食い方が異様なので電源を使用していない時はほとんど使っていません。
SRMの環境としてなぜかBoot Campで動いているWindows 8のEclipseを使用しているため普段は使用されることなく。
結局、環境作った筈なのに全く進まない。(正直Appleには頑張って欲しいところ、トラックパッドのドライバとか特に!)
そこで、Macで書けるようにしようということでclangとバトル。
これがまたあまりうまく行かなかった。普段C++を使わない人が適当に頑張ろうとするのが悪いのだろうと思いつつ延々。
clangに対してWindows 8+MinGW+Eclipseで成功した-std=c++11辺りを放り込んで色々やっていたもののあまりうまく行かず。
clang++ -std=c++11 -std=libc++ probtest.cpp
結論はあっけなく。c++として認識させろということでした、はい。
と、Macで書けるようになった。この程度だとvimとコンソールで書けるしWindowsのcygwinでできるのでは…ということで色々。
clang++と試行錯誤しつつ延々酷い目にあって、C_INCLUDE_PATHやCPLUS_INCLUDE_PATH、LIBRARY_PATHを弄っていて。
Eclipse側が読み込んでいるPleiadesお抱えのMinGW配下のファイルを読み込ませても上手く行かなかった。
そこで方針転換。cygwinが抱えているヘッダファイル達を読み込む方向に転換するもなにかがおかしい。
clangやgccが抱えていたヘッダファイル等をEclipseの読み先と似たように持ってきているのに全く通らず。
エラー吐いている部分を適当にググるとStackOverFlowがヒットして、調べるとcygwinのgccがこの例と同じく4.5.3。
cygwinのインストーラーを持ってきて4.5.3を使っている部分をすべからく4.7.2にアップデートしたところコンパイル成功。
clang++ -std=c++ probtest.cpp
教訓:環境とデフォルト設定を疑え
と、これでコンソールで書けるようになったのでDropboxか何かで同期させておけばいつでもできる。
引数の微妙な差分は.zshrcで環境ごとにalias通して作業すれば十分。
しかし…TopCoderはC++11じゃないしこの環境だと参加するには微妙なところだな…。