使用g++或者gcc编译程序并运行
在 Linux 下使用 gcc(用于 C)和 g++(用于 C++)编译并运行程序,整体流程非常简单。下面从安装编译器开始,逐步覆盖最常用的场景。
1. 确认或安装编译器
NOTE
树莓派系统镜像默认已经安装
多数 Linux 发行版自带 GCC 工具链,如果没有,可用以下命令安装:
# Debian / Ubuntu
sudo apt update
sudo apt install gcc g++ make
# Fedora / RHEL
sudo dnf install gcc gcc-c++ make
# Arch Linux
sudo pacman -S gcc make
检查是否安装成功:
gcc --version
g++ --version
2. 编写一个简单的源文件
C 语言示例:hello.c
#include <stdio.h>
int main() {
printf("Hello, C!\n");
return 0;
}
C++ 示例:hello.cpp
#include <iostream>
int main() {
std::cout << "Hello, C++!" << std::endl;
return 0;
}
3. 基础编译与运行
对于 C 程序
# 编译(默认输出文件名为 a.out)
gcc hello.c
# 运行
./a.out
对于 C++ 程序
# 编译
g++ hello.cpp
# 运行
./a.out
4. 指定输出文件名(-o 选项)
使用 -o 自定义可执行文件的名称:
gcc hello.c -o hello_c
g++ hello.cpp -o hello_cpp
./hello_c
./hello_cpp
5. 常用编译选项说明
| 选项 | 含义 |
|---|---|
-Wall |
开启几乎所有警告,帮助发现潜在问题 |
-Wextra |
在 -Wall 之外再开启额外警告 |
-g |
生成调试信息(便于用 GDB 调试) |
-O2 或 -O3 |
优化级别(-O0 无优化,-O2 常用发布优化) |
-std=c99 / -std=c11 |
指定 C 语言标准 |
-std=c++11 / -std=c++17 |
指定 C++ 语言标准 |
-I<路径> |
添加头文件搜索路径 |
-L<路径> |
添加库文件搜索路径 |
-l<库名> |
链接指定库(如 -lm 链接数学库) |
示例:编译时显示警告并使用 C++17 标准:
g++ -Wall -Wextra -std=c++17 hello.cpp -o hello
6. 多文件编译
假设项目包含两个源文件:
-
main.cpp -
math_utils.cpp 及其头文件math_utils.h
方法一:一步编译所有源文件
g++ main.cpp math_utils.cpp -o myprogram
方法二:先编译成目标文件(.o),再链接
# 生成目标文件
g++ -c main.cpp # 产生 main.o
g++ -c math_utils.cpp # 产生 math_utils.o
# 链接目标文件生成可执行文件
g++ main.o math_utils.o -o myprogram
运行
./myprogram
7. 链接外部库
以数学库(libm)为例,该库包含 sin、cos 等函数。
C 示例(需要 -lm):
#include <stdio.h>
#include <math.h>
int main() {
double x = 2.0;
printf("sqrt(%f) = %f\n", x, sqrt(x));
return 0;
}
编译命令:
gcc math_example.c -o math_example -lm
C++ 示例(标准库中的数学函数已在 libstdc++ 中,通常不需要额外链接 -lm,但显式加上也没关系):
g++ math_example.cpp -o math_example
8. 编译时添加头文件路径和库路径
如果头文件不在系统标准目录,库文件不在 /usr/lib 等位置,需要指明路径。
g++ main.cpp -I/path/to/headers -L/path/to/libs -lmylib -o myapp
-
-I:头文件搜索路径(大写 i) -
-L:库文件搜索路径 -
-l:库名(去掉前缀lib 和后缀.a 或.so)
9. 使用 Makefile 简化构建
对于稍大的项目,手动敲命令容易出错,可使用简单的 Makefile:
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = myprogram
OBJS = main.o math_utils.o
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
然后在终端执行:
make # 编译
./myprogram # 运行
make clean # 清理生成文件
10. 常见问题速查
| 问题现象 | 可能原因 / 解决办法 |
|---|---|
gcc: command not found |
未安装编译器,按第 1 步安装 |
undefined reference to ... |
缺少库链接,用 -l 添加库(例如 -lm、-lpthread) |
No such file or directory |
源文件路径错误,或编译输出的可执行文件不在当前目录 |
permission denied 运行程序 |
使用 chmod +x 程序名 添加执行权限 |
编译通过但运行报错 segmentation fault |
代码有内存错误,可用 -g 编译后用 gdb ./程序 调试 |
总结一句话流程
# 写代码 → 编译 → 运行
g++ 源文件.cpp -o 程序名
./程序名