编译工具链与开发环境
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_PATHMake构建工具
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 programMakefile变量
# 变量定义
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 dirsCMake构建系统
基本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 cleanGit版本控制
基本配置
# 配置用户信息
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 # 退出GDBValgrind内存检测
# 检测内存泄漏
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_常用命令速查表