GNU工具链
简述
Gnu toolchain是开发操作系统、应用程序的一套完整的程序和库,包括gcc、gdb、glibc:
•cpp
•m4
•gas
•gcc、g++
•ld
•glibc、libc++
•gdb
•makefile
•libtool
•binutils: ar、objdump、c++filt、nm、readelf等
•autoconf、automake
相当与工业制造中的母机
gcc
是一族编译器,包括c、c++、go、java等
前端+后端
•.c为后缀的文件,C语言源代码文件;
•.a为后缀的文件,是由目标文件构成的档案库文件;
•.C、.cc或.cxx 为后缀的文件,是C++源代码文件;
•.h为后缀的文件,是程序所包含的头文件;
•.i 为后缀的文件,是已经预处理过的C源代码文件;
•.ii为后缀的文件,是已经预处理过的C++源代码文件;
•.m为后缀的文件,是Objective-C源代码文件;
•.o为后缀的文件,是编译后的目标文件;
•.s为后缀的文件,是汇编语言源代码文件;
•.S为后缀的文件,是经过预编译的汇编语言源代码文件。
C语言编译过程
•gcc -E hello.c -o hello.i
•gcc -S hello.i -o hello.s
•gcc -c hello.s -o hello.o
•gcc -o hello hello.o
gdb
•gdb program
命令 | 缩写 | 描述 |
---|---|---|
list | l | 打印当前位置源码 |
break | b | 设置断点 |
run | r | 运行程序 |
step | s | 单步,进入函数 |
next | n | 单步,不进入函数 |
p | 打印变量 | |
continue | c | 继续运行 |
backtrace | bt | 显示调用栈 |
info threads | 显示线程 | |
thread n | 切换线程 | |
set scheduler-locking on | 关闭线程调度 |
makefile
Makefile用于工程组织和编译
与常见的命令式语言不同,它是一种依赖推导语言
Shell语言:变量定义+命令执行
Makefile:变量定义+依赖描述
例子
count_words: count_words.o lexer.o -lfl
gcc count_words.o lexer.o -lfl -o count_words
target: dependencies, …
actions
显式规则与隐式规则
%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
推导规则
•检查目标和依赖文件的时间,如果依赖更新,则执行动作
•显式规则 > 隐式规则
推导过程
•动态规划
•从target出发,枚举所有规则,直到依赖可达
Makefile的主要问题
- 推导结论没有显式导出,不便于理解
- 应该保存为中间结果,下次编译直接调用
- 中间结果保存为一棵树,同时编译
cmake
cross platform make跨平台自动化建置系统
Cmake vs Makefile
•Makefile的依赖推导不直观
•Cmake的语法设计采用命令式
•跨平台,可以导出为makefile、sln等
Cmake在不同平台上生成不同的本地化脚本
•Linux下的Gnu Makefile
•Visual Studio的sln
•Google等ninja
Cmake管理的代码编译主要有两步:
- 利用cmake生成本地编译脚本
- 利用本地脚本编译程序
基本语法
•定义工程
•设置变量
•添加可执行目标
•添加递归目录
•添加静态库、动态库
•条件分支
•定制命令和目标add_custom_command/add_custom_target
git
版本控制系统(Version Control System,简称VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
•本地版本控制系统
•集中化的版本控制系统
•分布式版本控制系统
Git的分布式管理
Git的分支管理
围绕主干开发
主要命令
•git init
•git clone
•git status
•git add
•git commit
•git log
•git fetch [remote-name]
•git push [remote-name] [branch-name]
•git branch
自己博客以前稍稍总结了下:git学习导引 | 小狐狸的被窝