2012年3月18日日曜日

Ubuntuでclangを利用する

clangは、GCCを置き換えることを目的としたコンパイラフロント・エンド。AppleやGoogleなどの サポートを受け活発に開発が進められている。

GoogleではC++で記述されたコードベースのリファクタリングにclangを利用している という動画 Clang MapReduce – Automatic C++ Refactoring at Google Scaleを見て興味を持ったので clangを試してみる。

ubuntuでは、clangパッケージが存在するので、

apt-get install clang

で、必要なパッケージをインストール。

早速、Hello Worldをclangでコンパイル。

#include <iostream>

int main(int argc, char *argv[]) {
  std::cout << "Hello, world!" << std::endl;

  return 0;
}

clang HelloWorld.cpp

すると以下のようなエラー・メッセージが出てコンパイルに失敗。

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function __cxx_global_var_init:HelloWorld.cpp(.text+0xc): error: undefined reference to 'std::ios_base::Init::~Init()'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function __cxx_global_var_init:HelloWorld.cpp(.text+0x30): error: undefined reference to 'std::ios_base::Init::Init()'
/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x65): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x70): error: undefined reference to 'std::cout'
/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x99): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0xa5): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'

collect2: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

エラー・メッセージに書かれているように-vオプションを指定して、コンパイルするも ビルド時のオプションが羅列されるだけで解決方法は見つからない。

ググってみると同じエラーに遭遇した人のブログを発見。

clangでc++を試して四苦八苦したメモ:筆者は病気シリーズ3

gccにC++ビルド用のコマンドg++があるのと同様に、clangにもC++ビルド用のclang++コマンドがあるらしい。 上記コードをclang++でビルドすると無事ビルドに成功。

無事にインストールとビルドができたので、しばらくclangで遊んでみよう。

あと、最新バージョンのclangをソースコードからビルドして試してみないと。