7.1编译一个简单的C++程序
编译C++程序和编译C程序是一样的,但是使用g++而不是gcc命令。两个编译器都是GNU编译器集合的一部分。
为了说明g++的使用方法,这里有一个C++版的Hello World程序:
include <iostream>
int
main ()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
使用下面命令编译此程序:
$ g++ -Wall hello.cc -o hello
C++编译器的前端使用了许多和C编译器gcc一样的编译选项。也提供了一些额外选项来控制C++语言特性,本章将会介绍这些特性。注意C++源码文件应该使用’.cc’、’.cpp’、’.cxx’或者’.C’扩展名而不能使用’.c’是c程序的扩展名。
运行可执行文件的方式也和C程序是一样的,只需要简单的输入文件名:
$ ./hello
Hello, world!
程序的输出和C版本的hello world程序一样,使用std::cout而不是C语言的printf函数。所有前面介绍的用于编译和链接文件和库的gcc命令选项都可以用于g++且不需要任何改变(当然使用g++而不是gcc)。一个天然区别是’-ansi’选项当使用g++时要求使用C++标准编译程序而不是C标准。
注意使用C++目标文件的程序为了支持合适的C++库,必须使用g++链接。试图使用C编译器gcc链接C++目标文件会造成”undefined reference”的错误:
$ g++ -Wall -c hello.cc
$ gcc hello.o (should use g++)
hello.o: In function ‘main’:
hello.o(.text+0x1b): undefined reference to ‘std::cout’
.....
hello.o(.eh_frame+0x11):
undefined reference to ‘__gxx_personality_v0’
使用g++链接相同的目标文件支持所有必要的C++库并生成可用的可执行文件:
$ g++ hello.o
$ ./a.out
Hello, world!
有一点会造成迷惑,当gcc检测到C++文件时会编译C++源代码,但是不会链接最后生成的目标文件。
$ gcc -Wall -c hello.cc (succeeds, even for C++)
$ gcc hello.o
hello.o: In function ‘main’:
hello.o(.text+0x1b): undefined reference to ‘std::cout’
为了避免这样的问题最好使用g++编译C++程序,用gcc编译C程序。