跳过正文
  1. C++ 学习/

Linux 下的 C++ 编程

·837 字·2 分钟· loading · loading · ·
Fairchild
作者
Fairchild
土木逆子
14:30
目录
linux - 这篇文章属于一个选集。
§ 2: 本文

1 Gcc
#

GCC 原本是 GNU C Compiler 的简称,现在是 GNU Compiler Collection 的简称。

# 下载安装
sudo apt install gcc

# 版本信息
gcc -v

# 查看帮助
gcc --help

# 编译运行
gcc hello.c
./a.out

-E 只做预处理,不编译,得到文本文件 hello.i
-S 只编译,将 C 程序编译为汇编文件 hello.s
-c 只汇编,不链接,生成目标文件 hello.o
-o 指定输出的文件名,即重命名可执行文件 a.out
-Wall 显示警告信息
-g debug 模式

2 GDB
#

GNU Symbolic Debugger,简称 GDB,是一款功能强大的调试器。

# 下载安装
sudo apt install gdb

# 版本信息
gdb -v

# debug 模式编译,关闭所有优化
gcc -g -O0 demo.c -o demo

# 进入调试
gdb demo

(gdb) l 查看部分源代码 list
(gdb) b 8 在第 8 行打断点 break
(gdb) r 运行 run
(gdb) p i 在断点处打印 print 变量 i
(gdb) c 继续 continue
(gdb) n 进入单步调试 next
(gdb) q 退出 quit

以上这些命令可以用英文全称

(gdb) 回车重复上一次操作
(gdb) watch num 监视变量 num 变化
(gdb) rwatch num 变量 num 被读时,程序暂停
(gdb) awatch num 变量 num 被读或被写时,程序暂停
(gdb) info watchpoints 查看当前设置的所有监视点

3 Makefile
#

Makefile 是多文件编程的自动化构建工具,用于管理文件依赖关系和编译过程。

# 下载安装
sudo apt install make

# 版本信息
make -v

# 查看帮助
make --help

Makefile 的核心是规则,基本格式如下:

目标: 依赖
    命令
  • 目标:要生成的文件名,也可以是伪目标(如 clean)
  • 依赖:生成目标所需要的文件
  • 命令:如何生成目标,必须以 Tab 开头

假设项目有三个文件:main.c、utils.c、utils.h

# 最终目标:生成可执行文件 app
app: main.o utils.o
    gcc main.o utils.o -o app

# 编译 main.c 生成 main.o
main.o: main.c utils.h
    gcc -c main.c -o main.o

# 编译 utils.c 生成 utils.o
utils.o: utils.c utils.h
    gcc -c utils.c -o utils.o

# 清理编译生成的文件
clean:
    rm -f *.o app

# 伪目标,不生成实际文件
.PHONY: clean

Makefile 支持变量和自动推导规则

# 定义变量
CC = gcc
CFLAGS = -Wall -g
TARGET = app
OBJS = main.o utils.o

# 默认目标
$(TARGET): $(OBJS)
    $(CC) $^ -o $@

# 自动推导:.c 文件会自动编译成 .o 文件
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

# 清理
clean:
    rm -f $(OBJS) $(TARGET)

.PHONY: clean

$@ 规则中的目标
$< 第一个依赖文件
$^ 所有依赖文件

make                # 编译项目(执行第一个目标 app)
make app            # 只编译 app
make main.o         # 只编译 main.o
make clean          # 清理所有编译生成的文件
make -n             # 预览将要执行的命令,但不实际执行(dry run)
make -f MyMakefile  # 使用指定的 Makefile 文件

4 Cmake
#

CMake 官网
CMake 教程

CMake 是一个开源的跨平台构建系统工具,用于通过简单的配置文件自动管理软件的编译、链接和安装过程。


 Linux 基础 C++ for_each 遍历算法