编译工具链与开发环境

GCC编译器

基本编译流程

# 预处理 → 编译 → 汇编 → 链接
# 源文件(.c) → 预处理(.i) → 汇编(.s) → 目标文件(.o) → 可执行文件
 
# 一步编译
gcc hello.c -o hello
 
# 分步编译
gcc -E hello.c -o hello.i            # 预处理
gcc -S hello.i -o hello.s            # 编译为汇编
gcc -c hello.s -o hello.o            # 汇编为目标文件
gcc hello.o -o hello                  # 链接

常用选项

选项说明
-o指定输出文件名
-c只编译不链接,生成.o文件
-S生成汇编代码
-E只预处理
-g包含调试信息
-O0/-O1/-O2/-O3优化级别
-Wall显示所有警告
-Wextra额外警告
-std=c11指定C标准
-I指定头文件搜索路径
-L指定库文件搜索路径
-l链接库

编译示例

# 基本编译
gcc -Wall -g -O2 program.c -o program
 
# 多文件编译
gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
gcc main.o utils.o -o program
 
# 或一步完成
gcc main.c utils.c -o program
 
# 指定头文件路径
gcc -I./include program.c -o program
 
# 链接库
gcc program.c -lm -o program          # 链接math库
gcc program.c -lpthread -o program    # 链接pthread库
gcc program.c -L./lib -lmylib -o program  # 链接自定义库
 
# C++编译
g++ -std=c++17 program.cpp -o program

预处理器宏

# 定义宏
gcc -DDEBUG program.c -o program      # 定义DEBUG宏
gcc -DVERSION=100 program.c -o program  # 定义VERSION=100
 
# 查看预处理结果
gcc -E program.c | less

静态库与动态库

# 创建静态库(.a)
gcc -c lib.c -o lib.o
ar rcs libmylib.a lib.o
 
# 使用静态库
gcc main.c -L. -lmylib -o program
 
# 创建动态库(.so)
gcc -fPIC -shared lib.c -o libmylib.so
 
# 使用动态库
gcc main.c -L. -lmylib -o program
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Make构建工具

Makefile基本结构

# 目标: 依赖
#     命令(必须用Tab缩进)
 
target: dependencies
    command
 
# 示例
program: main.o utils.o
    gcc main.o utils.o -o program
 
main.o: main.c utils.h
    gcc -c main.c -o main.o
 
utils.o: utils.c utils.h
    gcc -c utils.c -o utils.o
 
clean:
    rm -f *.o program

Makefile变量

# 变量定义
CC = gcc
CFLAGS = -Wall -g -O2
LDFLAGS = -lm
SRC = main.c utils.c
OBJ = $(SRC:.c=.o)
TARGET = program
 
# 使用变量
$(TARGET): $(OBJ)
    $(CC) $(OBJ) -o $(TARGET) $(LDFLAGS)
 
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
 
clean:
    rm -f $(OBJ) $(TARGET)
 
# 自动变量
# $@ - 目标文件名
# $< - 第一个依赖文件名
# $^ - 所有依赖文件名
# $* - 不含扩展名的目标

完整Makefile示例

# 编译器设置
CC = gcc
CXX = g++
CFLAGS = -Wall -Wextra -g -O2
CXXFLAGS = -Wall -Wextra -g -O2 -std=c++17
LDFLAGS = -lpthread
 
# 目录设置
SRC_DIR = src
INC_DIR = include
OBJ_DIR = obj
BIN_DIR = bin
 
# 源文件
SRC = $(wildcard $(SRC_DIR)/*.c)
OBJ = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC))
TARGET = $(BIN_DIR)/program
 
# 包含路径
INCLUDES = -I$(INC_DIR)
 
# 默认目标
all: dirs $(TARGET)
 
# 创建目录
dirs:
    mkdir -p $(OBJ_DIR) $(BIN_DIR)
 
# 链接
$(TARGET): $(OBJ)
    $(CC) $^ -o $@ $(LDFLAGS)
 
# 编译
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
 
# 清理
clean:
    rm -rf $(OBJ_DIR) $(BIN_DIR)
 
.PHONY: all clean dirs

CMake构建系统

基本CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0 LANGUAGES C CXX)
 
# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
# 添加可执行文件
add_executable(program
    src/main.cpp
    src/utils.cpp
)
 
# 包含头文件目录
target_include_directories(program PRIVATE include)
 
# 链接库
target_link_libraries(program pthread)
 
# 添加子目录
add_subdirectory(lib)

构建流程

# 创建构建目录
mkdir build && cd build
 
# 生成构建文件
cmake ..
 
# 编译
make
 
# 或一步完成
cmake --build .
 
# 安装
cmake --install .
 
# 清理
cmake --build . --target clean

Git版本控制

基本配置

# 配置用户信息
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
 
# 配置编辑器
git config --global core.editor vim
 
# 查看配置
git config --list

基本操作

# 初始化仓库
git init
 
# 克隆仓库
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git
 
# 查看状态
git status
 
# 添加文件
git add file.txt
git add .                            # 添加所有
git add -A                           # 添加所有(包括删除)
 
# 提交
git commit -m "message"
git commit -am "message"             # 添加并提交(已跟踪文件)
 
# 查看历史
git log
git log --oneline
git log --graph --oneline --all
 
# 查看差异
git diff                             # 工作区vs暂存区
git diff --cached                    # 暂存区vs最新提交
git diff HEAD                        # 工作区vs最新提交

分支操作

# 查看分支
git branch                           # 本地分支
git branch -a                        # 所有分支
git branch -r                        # 远程分支
 
# 创建分支
git branch feature
git checkout -b feature              # 创建并切换
 
# 切换分支
git checkout feature
git switch feature                   # 新命令
 
# 合并分支
git checkout main
git merge feature
 
# 删除分支
git branch -d feature                # 已合并的分支
git branch -D feature                # 强制删除
 
# 重命名分支
git branch -m old-name new-name

远程操作

# 查看远程
git remote -v
 
# 添加远程
git remote add origin https://github.com/user/repo.git
 
# 推送
git push origin main
git push -u origin main              # 设置上游并推送
 
# 拉取
git pull origin main
git fetch origin                     # 只获取不合并
 
# 删除远程分支
git push origin --delete feature

撤销操作

# 撤销工作区修改
git checkout -- file.txt
git restore file.txt                 # 新命令
 
# 撤销暂存
git reset HEAD file.txt
git restore --staged file.txt        # 新命令
 
# 撤销提交
git reset --soft HEAD~1              # 保留修改
git reset --mixed HEAD~1             # 保留工作区修改(默认)
git reset --hard HEAD~1              # 丢弃所有修改
 
# 修改最后一次提交
git commit --amend -m "new message"
 
# 查看操作历史
git reflog

.gitignore配置

# 编译输出
*.o
*.a
*.so
*.exe
build/
dist/
 
# IDE配置
.idea/
.vscode/
*.swp
 
# 系统文件
.DS_Store
Thumbs.db
 
# 日志和临时文件
*.log
*.tmp
*.temp
 
# 依赖目录
node_modules/
vendor/
 
# 环境配置
.env
.env.local

调试工具

GDB调试器

# 编译时添加调试信息
gcc -g program.c -o program
 
# 启动GDB
gdb ./program
gdb --args ./program arg1 arg2
 
# 常用命令
run                                  # 运行程序
break main                           # 在main函数设置断点
break file.c:10                      # 在第10行设置断点
break file.c:func                    # 在func函数设置断点
info breakpoints                     # 查看断点
delete 1                             # 删除断点1
 
next                                  # 执行下一行(不进入函数)
step                                  # 执行下一行(进入函数)
continue                              # 继续执行
finish                                # 执行到函数返回
 
print var                            # 打印变量值
print *ptr                           # 打印指针指向的值
print arr[0]@10                      # 打印数组前10个元素
set var = 10                         # 修改变量值
 
backtrace                            # 查看调用栈
frame 1                              # 切换到栈帧1
info locals                          # 查看局部变量
 
watch var                            # 监视变量变化
x/10x &var                           # 查看内存(16进制)
 
quit                                  # 退出GDB

Valgrind内存检测

# 检测内存泄漏
valgrind --leak-check=full ./program
 
# 检测内存错误
valgrind --tool=memcheck ./program
 
# 性能分析
valgrind --tool=callgrind ./program
kcachegrind callgrind.out.*
 
# 堆分析
valgrind --tool=massif ./program
ms_print massif.out.*

💡 开发环境建议:

  • 使用版本控制管理代码
  • 编译时开启警告选项
  • 使用调试器定位问题
  • 定期进行代码静态分析

🔗 相关笔记: 03.01_包管理工具 02.06_Shell脚本 99.01_常用命令速查表