使用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 程序名
./程序名