1.编译,库,调试 Makefile工程管理器
gcc/g++编译器
对于.c格式的C文件,可以采用gcc或g++编译
对于.cc .cpp格式的C++文件,应该采用g++进行编译
常用的选项
-c 表示编译源文件
-o 表示输出目标文件
-g 表示在目标文件中产生调试信息,用于gdb调试
gcc编译过程:预编译*编译*汇编*链接
预处理:预处理器对源文件中的宏进行展开
编译:gcc将c文件编译成汇编文件
汇编:as将汇编文件编译成机器码
链接:将目标文件和外部符号进行链接,得到一个可执行二进制文件
2.gcc库选项
函数库分为静态库和动态库
静态库:如果在编译某个程序时链接静态库, 则链接器将会搜索静态库并直接拷贝到该程序
的可执行二进制文件到当前文件中
动态库:在编译时并不会链接到目标代码中,而是在程序运行时才被载入
3.make工程管理器
可以试想一下, 有一个上百个文件的代码构成的项目, 如果其中只有
一个活少数几个文件进行了修改, 如果再从头到尾将每一个文件都重
新编译是个比较繁琐的过程。 为此, 引入了 Make 工程管理器的概念,
工程管理器指管理较多的文件, 它是自动管理器能根据文件时间自动
发现更新过的文件而减少编译的工作量, 同时通过读入 Makefile 文件
来执行大量的编译工作
Makefile 格式
target: dependency_files //目标项:依赖项
< TAB >command //必须以 tab 开头, command 编译命令
注意点: 在写 command 命令行的时候, 必须要在前面按 TAB 键
使用 make 编译
对于该 Makefile 文件,程序 make 处理过程如下:
make 程序首先读到第 1 行的目标文件 main.exe 和它的两个依赖文件
main.o 和 func.o;然后比较文件 main.exe 和 main.o/func.o 的产生时间,
如果 main.exe 比 main.o/func.o 旧的话, 则执行第 2 条命令, 以产生
目标文件 main.exe。
在执行第 2 行的命令前,它首先会查看 makefile 中的其他定义, 看有
没有以第 1 行 main.o 和 func.o 为目标文件的依赖文件, 如果有的话,
继续按照(1)、 (2)的方式匹配下去。
根据(2)的匹配过程, make 程序发现第 3 行有目标文件 main.o 依赖于
main.cpp, 则比较目 main.o 与它的依赖文件 main.cpp 的文件新旧,如
果 main.o 比 main.cpp 旧,则执行第 4 行的命令以产生目标文件 main.o.
在执行第 4 条命令时,main.cpp 在文件 makefile 不再有依赖文件的定
义,make 程序不再继续往下匹配,而是执行第 4 条命令,产生目标文件
main.o
目标文件 func.o 按照上面的同样方式判断产生.
执行(3)、 (4)产生完 main.o 和 func.o 以后, 则第 2 行的命令可以顺利
地执行了, 最终产生了第 1 行的目标文件 main.exe。
特殊处理与伪目标
.PHONY 是 Makefile 文件的关键字, 表示它后面列表中的目标均为伪
目标
.PHONY:b
b:
echo ‘b’ //通常用@echo “hello”
伪目标通常用在清理文件、 强制重新编译等情况下。
Example1:main.c 函数, func.c 函数为前面计算+,-,*,/运算的程序
#vi Makefile //系统默认的文件名为 Makefile
main.exe:main.o func.o //表示要想生成 main.exe 文件, 要依赖于
main.o 和 func.o 文件
gcc -o main.exe main.o func.o//如果 main.o,func.o 已经存在
了, 就链接成 main.exe
main.o:main.c //表示 main.o 文件依赖于 main.c 文件
gcc -c main.c //编译 main.c, 默认生成 main.o。 可写为:
gcc –c main.c –o main.o
func.o:func.c //表示 func.o 文件依赖于 func.c 文件
gcc -c func.c //如果 func.c 存在,则编译 func.c ,生成 func.o
.PHONY:rebuild clean //表示后面的是伪目标, 通常用在清理文件、 强
制重新编译等情况下
rebuild:clean main.exe //先执行清理, 在执行 main.exe
clean:
rm –rf main.o func.o main.exe | //最后删除.o 和.exe 的文件 | |
按 ESC 键之后, :wq 保存退出 再执行下面的命令: | ||
#make | //直接 make,即从默认文件名( Makefile) 的第一行开始 | |
执行 #make clean | //表示执行 clean: 开始的命令段 |
#make func.o //表示执行 func.o: 开始的命令段
#make rebuild //则先执行清除, 再重新编译连接
如果不用系统默认的文件名 Makefile, 而是用户随便起的一个名字,
如:
#vi Makefile11
则 make 后面必须要加上 -f Makefile11 , 如:
#make –f Makefile11 clean //表示执行 clean: 开始的命令段
#make –f Makefile11 main.exe //表示执行 main.exe: 开始的命令段
4.gdb常用命令
gdb a.out/ 进入调试
l //显示代码
b4 //在第四行设置断点
r //运行
n //下一步不进入函数
s //表示单步进行函数
p l //打印变量l
c //运行到最后
q //退出
set args //运行时的参数
show args//查看设置好的运行参数
path dir //设定程序的运行路径
show path //查看程序的运行路径
cd dir //进入到dir目录
pwd显示当前工作目录
info b //查看所设断点
backtrace 查看当前栈的情况,即可以查到调用哪些函数尚未返回