简述

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

C语言编译过程

gdb

•gdb program

命令 缩写 描述
list l 打印当前位置源码
break b 设置断点
run r 运行程序
step s 单步,进入函数
next n 单步,不进入函数
print 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的主要问题

  1. 推导结论没有显式导出,不便于理解
  2. 应该保存为中间结果,下次编译直接调用
  3. 中间结果保存为一棵树,同时编译

cmake

cross platform make跨平台自动化建置系统

Cmake vs Makefile

•Makefile的依赖推导不直观

•Cmake的语法设计采用命令式

•跨平台,可以导出为makefile、sln等

Cmake在不同平台上生成不同的本地化脚本

•Linux下的Gnu Makefile

•Visual Studio的sln

•Google等ninja

Cmake管理的代码编译主要有两步:

  1. 利用cmake生成本地编译脚本
  2. 利用本地脚本编译程序

基本语法

•定义工程

•设置变量

•添加可执行目标

•添加递归目录

•添加静态库、动态库

•条件分支

•定制命令和目标add_custom_command/add_custom_target

git

版本控制系统(Version Control System,简称VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

•本地版本控制系统

•集中化的版本控制系统

•分布式版本控制系统

Git的分布式管理

Git的分布式管理

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学习导引 | 小狐狸的被窝