gccコマンドでC++のコードをコンパイルする。
そんなことしたくないですが……。
TAがC++で出したコードをCのコードだと思ってgccでビルドしたぽくて文句を言ってきた。
hello.cpp#include <iostream>
int main(int, char**) { std::cout << "Hello, World!" << std::endl;}試しにこのコードを
gcc hello.cpp ( g++ hello.cpp ではなく)してみる。out$ gcc hello.cpp/usr/bin/ld: /tmp/cczEiB7v.o: in function `main':hello.cpp:(.text+0x1d): undefined reference to `std::cout'/usr/bin/ld: hello.cpp:(.text+0x22): 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: hello.cpp:(.text+0x2c): 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: hello.cpp:(.text+0x37): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'/usr/bin/ld: /tmp/cczEiB7v.o: in function `__static_initialization_and_destruction_0(int, int)':hello.cpp:(.text+0x6b): undefined reference to `std::ios_base::Init::Init()'/usr/bin/ld: hello.cpp:(.text+0x80): undefined reference to `std::ios_base::Init::~Init()'collect2: error: ld returned 1 exit statusldでコケてる。正直もっと無理だと思っていた(1行目の
で「そんなファイル無い」って言われるぐらいかと思ってた)。これ結構行けそうじゃない? と思って、
gcc hello.cpp -c する。通る。普通に hello.o できるじゃん。↑のldの文句を眺めてると、libstdc++のことを知らないだけっぽいので、
gcc hello.o -o hello -Wl,-lstdc++ してみると普通に hello できた。out2$ ./helloHello, World!へーまじか……おもしろ……となったのでここにめも。
windowsだと
cl.exe でどっちもコンパイルできるらしいぺこ。にこの挙動が書かれてる って反応をもらって「ほんとだ〜」って言った。