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程序。