Assuming a single source file named
main.cpp, the command to compile and link an non-optimized executable is as follows (Compiling without optimization is useful for initial development and debugging, although
[-Og](<https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-Og-723>) is officially recommended for newer GCC versions).
g++ -o app -Wall main.cpp -O0
To produce an optimized executable for use in production, use one of the
[-O](<https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-O-716>) options (see:
g++ -o app -Wall -O2 main.cpp
If the -O option is omitted, -O0, which means no optimizations, is used as default (specifying -O without a number resolves to -O1).
Alternatively, use optimization flags from the
O groups (or more experimental optimizations) directly. The following example builds with
-O2 optimization, plus one flag from the
-O3 optimization level:
g++ -o app -Wall -O2 -ftree-partial-pre main.cpp
To produce a platform-specific optimized executable (for use in production on the machine with the same architecture), use:
g++ -o app -Wall -O2 -march=native main.cpp
Either of the above will produce a binary file that can be run with
.\\app.exe on Windows and
./app on Linux, Mac OS, etc.
[-o](<https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-o-86>) flag can also be skipped. In this case, GCC will create default output executable
a.exe on Windows and
a.out on Unix-like systems. To compile a file without linking it, use the
g++ -o file.o -Wall -c file.cpp
This produces an object file named
file.o which can later be linked with other files to produce a binary:
g++ -o app file.o otherfile.o
More about optimization options can be found at gcc.gnu.org. Of particular note are
-Og (optimization with an emphasis on debugging experience – recommended for the standard edit-compile-debug cycle) and
-Ofast (all optimizations, including ones disregarding strict standards compliance).
[-Wall](<https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wall-307>) flag enables warnings for many common errors and should always be used. To improve code quality it is often encouraged also to use
[-Wextra](<https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wextra-310>) and other warning flags which are not automatically enabled by
If the code expects a specific C++ standard, specify which standard to use by including the
[-std=](<https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-std-112>) flag. Supported values correspond to the year of finalization for each version of the ISO C++ standard. As of GCC 6.1.0, valid values for the
std= flag are
c++1z. Values separated by a forward slash are equivalent.
g++ -std=c++11 <file>
GCC includes some compiler-specific extensions that are disabled when they conflict with a standard specified by the
-std= flag. To compile with all extensions enabled, the value
gnu++XX may be used, where
XX is any of the years used by the
c++ values listed above.
The default standard will be used if none is specified. For versions of GCC prior to 6.1.0, the default is
-std=gnu++03; in GCC 6.1.0 and greater, the default is