7.1 Compiling a simple C++ program
The procedure for compiling a C++ program is the same as for a C
program, but uses the command g++
instead of gcc
. Both
compilers are part of the GNU Compiler Collection.
To demonstrate the use of g++
, here is a version of the Hello
World program written in C++:
#include <iostream>
int
main ()
{
std::cout << "Hello, world!\n";
return 0;
}
The program can be compiled with the following command line:
$ g++ -Wall hello.cc -o hello
The C++ frontend of GCC uses many of the same the same options as the C
compiler gcc
. It also supports some additional options for
controlling C++ language features, which will be described in this
chapter. Note that C++ source code should be given one of the valid C++
file extensions '.cc', '.cpp', '.cxx' or '.C' rather
than the '.c' extension used for C programs.
The resulting executable can be run in exactly same way as the C
version, simply by typing its filename:
$ ./hello
Hello, world!
The executable produces the same output as the C version of the program,
using std::cout
instead of the C printf
function. All the
options used in the gcc
commands in previous chapters apply to
g++
without change, as do the procedures for compiling and
linking files and libraries (using g++
instead of gcc
, of
course). One natural difference is that the -ansi
option
requests compliance with the C++ standard, instead of the C standard, when
used with g++
.
Note that programs using C++ object files must always be linked with
g++
, in order to supply the appropriate C++ libraries.
Attempting to link a C++ object file with the C compiler gcc
will
cause "undefined reference" errors for C++ standard library functions:
$ 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'
Undefined references to internal run-time library functions, such as
__gxx_personality_v0
, are also a symptom of linking C++ object
files with gcc
instead of g++
. Linking the same object
file with g++
supplies all the necessary C++ libraries and will
produce a working executable:
$ g++ hello.o
$ ./a.out
Hello, world!
A point that sometimes causes confusion is that gcc
will actually
compile C++ source code when it detects a C++ file extension, but cannot
then link the resulting object files.
$ 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'
To avoid this problem, use g++
consistently for C++
programs and gcc
for C programs.