目录
5.1写一个Makefile来告诉make命令如何编译和链接这几个文件,规则
1.编译器 gcc/g++ 简介:
Linux系统下的 gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它是GNU的代表作品之一,gcc是可以在多种硬件平台上编译出可执行文件的超级编译器,其执行效率比一般的编译器要高20%-30%。编译器能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字,gcc将生成一个默认名为a.out的可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件,而gcc则通过后缀来区别输入文件的类型。
2.gcc/g++ 的编译过程:
源文件(.c .h)-> 预处理->编译->汇编->(静态库,动态库)链接->可执行文件
预处理阶段: 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
执行:./hello
3.gdb简介:
GDB(GNU symbolic debugger)简单地说就是一个调试工具。它是一个受通用公共许可证即GPL保护的自由软件。
像所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时你可以查看变量、寄存器、内存及堆栈。更进一步你可以修改变量及内存值。GDB是一个功能很强大的调试器,它可以调试多种语言。在此我们仅涉及 C 和 C++ 的调试,而不包括其它语言。还有一点要说明的是,GDB是一个调试器,而不像 VC 是一个集成环境。你可以使用一些前端工具如XXGDB、DDD等。他们都有图形化界面,因此使用更方便,但它们仅是GDB的一层外壳。因此,你仍应熟悉GDB命令。事实上,当你使用这些图形化界面时间较长时,你才会发现熟悉GDB命令的重要性。
在你调试你的程序之前,当你编译你的源程序时,不要忘了 -g 选项或其它相应的选项,才能将调试信息加到你要调试的程序中。例如:gcc -g -o hello hello.c 。
4.gdb常用的调试命令:
(gdb)help
:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
(gdb)run
:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
(gdb)start
:单步执行,运行程序,停在第一执行语句
(gdb)list
:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l
(gdb)set
:设置变量的值
(gdb)next
:单步调试(逐过程,函数直接执行),简写n
(gdb)step
:单步调试(逐语句:跳入自定义函数内部执行),简写s
(gdb)backtrace
:查看函数的调用的栈帧和层级关系,简写bt
(gdb)frame
:切换函数的栈帧,简写f
(gdb)info
:查看函数内部局部变量的数值,简写i
(gdb)finish
:结束当前函数,返回到函数调用点
(gdb)continue
:继续运行,简写c
(gdb)print
:打印值及地址,简写p
(gdb)quit
:退出gdb,简写q
(gdb)break+num
:在第num行设置断点,简写b
(gdb)info breakpoints
:查看当前设置的所有断点
(gdb)delete breakpoints num
:删除第num个断点,简写d
(gdb)display
:追踪查看具体变量值
(gdb)undisplay
:取消追踪观察变量
(gdb)watch
:被设置观察点的变量发生修改时,打印显示
(gdb)i watch
:显示观察点
(gdb)enable breakpoints
:启用断点
(gdb)disable breakpoints
:禁用断点
(gdb)x
:查看内存x/20xw 显示20个单元,16进制,4字节每单元
(gdb)run argv[1] argv[2]
:调试时命令行传参
5.Makefile(makefile)简介:
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作。
特别在linux/Unix下的软件编译,就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.1写一个Makefile来告诉make命令如何编译和链接这几个文件。规则是:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
5.2Makefile代码示例:(进度条代码)
//proc.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define NUM 101
void proc();
//proc.c
#include"proc.h"
void proc()
{
char bar[NUM];
memset(bar,'\0',sizeof(bar));
const char*label="|/-\\";
int i=0;
while(i<100)
{
bar[i++]='#';
printf("[%-100s][%3d%%][%c]\r",bar,i,label[i%4]);
fflush(stdout);
usleep(30000);
}
printf("\n");
}
//main.c
#include"proc.h"
int main()
{
proc();
return 0;
}
//Makefile
1 cc=gcc
2 bin=proc
3 file_list=main.o proc.o
4 $(bin):$(file_list)
5 $(cc) $^ -o $@
6
7 %.o:%.c
8 $(cc) -c $<
9
10 .PHONY:clean
11 clean:
12 rm -f $(file_list) $(bin)