This article is generated by Tencent Yuanbao, with content outline and verification provided by @Xiao Hui~
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
1 Directory Options
1.1 Specifying Header File Search Path (-I)
When header files are not in standard directories (such as <span>/usr/include</span>), the <span>-I</span> option is used to specify additional search paths.
Example:
# Search for header files in the specified directory during compilation
gcc -I/home/user/include -I./src/include main.c -o main
This command will look for header files in <span>/home/user/include</span> and <span>./src/include</span> directories before searching the standard system paths.
1.2 Forcing Inclusion of Header Files (-include)
<span>-include</span> option is used to force the inclusion of a specified header file during compilation, equivalent to adding a <span>#include</span> directive in the source code.
Example:
# Force inclusion of config.h header file
gcc -include config.h main.c -o main
This command is equivalent to adding <span>#include "config.h"</span> at the beginning of the main.c file.
2 Linking Options
2.1 Linking Library Files (-l)
<span>-l</span> option is used to specify the library files that the program needs to link, without the prefix <span>lib</span> and suffix (such as <span>.so</span> or <span>.a</span>).
Example:
# Link the math library libm.so
gcc main.c -lm -o main
# Link custom library libnetwork.so
gcc main.c -L./lib -lnetwork -o main
2.2 Specifying Library Search Path (-L)
<span>-L</span> option is used to specify the search path for library files, usually used in conjunction with the <span>-l</span> option.
Example:
# Specify library file search path
gcc main.c -L/home/user/libs -L./lib -lmylib -o main
This command will first look for library files in <span>/home/user/libs</span> and <span>./lib</span> directories before searching the standard system paths.
2.3 Static Linking and Dynamic Linking
GCC uses dynamic linking by default, but can be forced to use static linking with the <span>-static</span> option.
Example:
# Static linking
gcc main.c -static -lm -o main_static
# Dynamic linking (default)
gcc main.c -lm -o main_dynamic
Static linking embeds the library code into the executable file, resulting in a larger file but with strong independence; dynamic linking generates a smaller file but requires external libraries at runtime.
3 Debugging Options
3.1 Generating Debug Information (-g)
<span>-g</span> option includes debug information in the executable file, facilitating debugging with tools like GDB.
Example:
# Generate debug information
gcc -g program.c -o program
# Debug with GDB
gdb ./program
You can specify the level of debug information, such as <span>-g1</span><code><span> (minimal information), </span><code><span>-g2</span><span> (default), or </span><code><span>-g3</span><span> (includes macro information).</span>
3.2 Optimization Options (-O)
GCC provides different levels of optimization options, from <span>-O0</span><span> (no optimization) to </span><code><span>-O3</span><span> (highest optimization).</span>
Example:
# No optimization
gcc -O0 program.c -o program
# Basic optimization
gcc -O1 program.c -o program
# High optimization (recommended)
gcc -O2 program.c -o program
# Aggressive optimization
gcc -O3 program.c -o program
# Optimize for code size
gcc -Os program.c -o program
<span>-O2</span> is the recommended optimization level, providing a good balance between optimization degree and compilation time.
3.3 Generating GDB-Specific Debug Information (-ggdb)
<span>-ggdb</span> option generates debug information optimized for the GDB debugger, containing more information than the standard <span>-g</span> option.
Example:
# Generate GDB-specific debug information
gcc -ggdb program.c -o program
3.4 Linker Options (-Wl)
<span>-Wl</span> option is used to pass parameters to the linker, with multiple parameters separated by commas.
Example:
# Link only the libraries actually used
gcc program.c -Wl,--as-needed -lm -o program
# Set runtime library search path
gcc program.c -Wl,-rpath,/path/to/libs -o program
<span>--as-needed</span> option instructs the linker to link only the libraries that are actually used, reducing unnecessary dependencies.
4 Error and Warning Options
4.1 Enabling Warning Messages (-Wall, -Wextra)
<span>-Wall</span> option enables most common warnings, while <span>-Wextra</span> provides additional warnings.
Example:
# Enable all common warnings
gcc -Wall program.c -o program
# Enable additional warnings
gcc -Wall -Wextra program.c -o program
These warnings can help identify potential issues in the code, such as unused variables, type mismatches, etc.
4.2 Treating Warnings as Errors (-Werror)
<span>-Werror</span> option treats all warnings as errors, stopping compilation upon encountering any warning.
Example:
# Treat warnings as errors
gcc -Wall -Werror program.c -o program
This option is suitable for strict project environments, ensuring that the code has no warnings.
4.3 Disabling Warnings (-w)
<span>-w</span> option disables all warning messages, which is not recommended for regular use.
Example:
# Disable all warnings
gcc -w program.c -o program
5 Comprehensive Example
Below is a comprehensive example using multiple options:
# Compile a program with debug information, enabling all warnings, and optimization level 2
gcc -Wall -Wextra -O2 -g -std=c11 \
-I./include -L./lib \
-DAPP_VERSION="1.0.0" \
main.c utils.c -o myapp -lmylib -lm
This command:
- Enables all warnings (
<span>-Wall -Wextra</span>) - Uses level two optimization (
<span>-O2</span>) - Includes debug information (
<span>-g</span>) - Uses C11 standard (
<span>-std=c11</span>) - Adds header file directory (
<span>-I./include</span>) - Adds library file directory (
<span>-L./lib</span>) - Defines version macro (
<span>-DAPP_VERSION="1.0.0"</span>) - Links mylib and math library (
<span>-lmylib -lm</span>) - Finally generates the executable file myapp