Ubuntu11.4のclangでC++のコンパイルするとiostreamとかのインクルードエラーが出る件の対処まとめ
さっきの方法 は何か怖いので正しいと思える方法で対処する。
ビルドするだけなら簡単だけど、apt的に色々あると嫌なのでUbuntuらしく、むしろDebianらしく解決してみる。
dpkgの作りかたは簡単だけど、我流すぎてバージョンの扱いとかわりと雑だったのでここを参考に作法とかに従ってみた。
とりあえず必要なものをインストール。なんか必要なさそうなのもインストールしてる気がするけど気にしない。
% sudo apt-get build-dep clang % sudo apt-get install devscripts
作業場所を作り、ソースをダウンロード。重い。
% mkdir ~/deb/clang % cd ~/deb/clang % apt-get source clang
作業ディレクトリに潜る。
% cd clang-2.8/debian % debchange -i
changelogを書くことになるので、バージョンが被らないように気をつけて書く。今回はこんな感じにした。
clang (2.8-0forgcc4.5) natty; urgency=low * add gcc4.5 include path -- illness072 <illness072@yukiho> Sat, 20 Aug 2011 23:08:03 +0900
インクルードパスがベタ書きされてる何か切ない気持ちにさせられるソースコードを編集。
% emacs clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp
--- clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp.orig 2011-08-20 22:57:03.556053522 +0900 +++ clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp 2011-08-20 22:50:15.046053387 +0900 @@ -615,6 +615,11 @@ // Debian based distros. // Note: these distros symlink /usr/include/c++/X.Y.Z -> X.Y //===------------------------------------------------------------------===// + // Ubuntu 11.04 "Natty Narwhal" -- gcc-4.5.2 + AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5", + "x86_64-linux-gnu", "32", "", triple); + AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5", + "i486-linux-gnu", "", "64", triple); // Ubuntu 10.04 LTS "Lucid Lynx" -- gcc-4.4.3 // Ubuntu 9.10 "Karmic Koala" -- gcc-4.4.1 // Debian 6.0 "squeeze" -- gcc-4.4.2
あとはビルドしてインストール。ビルドすごい時間かかる。アニメ1話ぶんじゃ済まないくらい時間かかる。
% debuild -us -uc % cd ../.. % sudo dpkg -i clang_2.8-0forgcc4.5_amd64.deb
さっきの方法で酷いシンボリックリンク作ったのならそれは消して、さっきのHelloWorldがコンパイルできるか試す。
% clang++ hello.cpp % ./a.out Hello, おにいちゃん!!
よし。