C++を知りたい(1) コンパイル
2009/07/14
C++は、いろいろ悪い評判が多いのにメジャーな言語で、ブログ界隈でもよく話題になる。でも、全然C++を理解できないので、ブログ上での話が理解できずにいた。ちょっとは話について行けるようになったらいいなという低い目標設定で始めてみよう。仕事ではないが、Cで小さいプロジェクト*1は続けているので、Cのことは一通りわかっているつもりです。「やさしいC++」を片手にC++を触ってみる。間違いなどあれば、教えてください。
まずは、Hello world!
まずは、Hello worldをやるという退屈な流れで、コンパイルの方法などを試してみる。
#include <iostream> using namespace std; int main() { cout << "Hello World!\n"; return 0; }
拡張子は、cpp? cxx? 両方見たことがあるけど、どっちが主流なんだろう?調べてみたら、cc c++ cp など色々あるようだった。
ccがUNIX流儀ということで、ccにしてみる。
普通にCの気分でコンパイルしてみる。
$ gcc hello.cc /tmp/ccG28JZJ.o(.text+0x19): In function `main': : undefined reference to `std::cout' /tmp/ccG28JZJ.o(.text+0x1e): In function `main': : 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*)' /tmp/ccG28JZJ.o(.text+0x4a): In function `__static_initialization_and_destruction_0(int, int)': : undefined reference to `std::ios_base::Init::Init[in-charge]()' /tmp/ccG28JZJ.o(.text+0x79): In function `__tcf_0': : undefined reference to `std::ios_base::Init::~Init [in-charge]()' /tmp/ccG28JZJ.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld はステータス 1 で終了しました
行く手を阻むかのようにエラーメッセージが表示された。undefined referenceなので、リンクに失敗してるのかもしれない。オプションが足りないんだろう。
$ gcc hello.cc -lstdc++ $ ./a.out Hello World!
C++のコンパイルは、g++を使えばいいということらしい。
$ g++ hello.cc
$ ./a.out
Hello World!
コンパイルとリンクを分けてみる。
$ g++ -c hello.cc $ g++ -o hello hello.o $ ./hello Hello World!
やさしいC++
なぜか、やさしいC++には、Visual C++の説明が少しのっている程度で、gccについての記述が無い。Hello Worldのコンパイルくらいgcc(g++)の例があってもいいのではないか?
*1:Cの小さいプロジェクトというのはStarbug1のこと