Linux下C语言开发基础
程序例子是简单的HELLO WORLD!
生成可执行文件
命令:#gcc hello.c -o hello
运行程序
#./hello 屏幕即显示hello world!
gcc编译器选项
-o选项,表示输出的可执行文件。
-c选项表示只输出目标代码,而不必输出可执行文件。
-g选项表示要求编译器在编译的时候提供对程序的调试信息。
例如:
#gcc -c test1.c //将test1.c编译成test1.o
#gcc -c test2.c //将test2.c编译成test2.o
#gcc -o test test1.o test2.o //将test1.o和test2.o链接成可执行文件test
GDB简介
GDB是GNU发布的一款功能强大的程序调试工具。GDB主要完成下面三方面的功能:
1、启动被调试程序。
2、让被调试的程序在指定的位置停住。
3、当程序被停住时,可以检查程序状态(如变量值)。
程序例子:起步(tst.c)
#include <stdio.h> void main() { int i; long result = 0; for(i=1;i<=100;i++) { result+=i; } printf("result = %d\n",result); }
GDB快速进阶
1、编译生成可执行文件:
gcc -g tst.c -o tst
2、启动GDB
gdb tst
3、在main函数处设置断点
break main
4、运行程序
run
5、单步运行
next
6、继续运行
continue
启动GDB
1、gdb调试程序名
例: gdb helloworld
2、gdb
file 调试程序名
GDB命令
list(l)查看程序
break(b)函数名在某函数入口处添加断点
break(b)行号在指定行添加断点
break(b)文件名:行号在指定文件的指定行添加断点
break(b)行号if条件当条件为真时,指定行号处断点生效,例b 5 if i=10,当i等于10第5行断点生效
info break查看所有设置的断点
delete断点编号删除断点
run(r)开始运行程序
next(n)单步运行程序(不进入子函数)
step(s)单步运行程序(进入子函数)
continue(c)继续运行程序
print(p)变量名查看指定变量值
finish运行程序,直到当前函数结束
watch变量名对指定变量进行监控
quit(q)退出gdb
Make与Makefile基础
在大型的开发项目中,通常有几十个到上百个的源文件,如果每次均手工键入gcc命令进行编译,会非常不方便。
Linux专门为软件开发提供了一个自动化的管理工具GNU make。
make可以自动地更新和编译程序。make将整个软件项目的代码分开在几个小的源文件里,在改动其中一个文件的时候,可以只对该文件重新进行编译,然后重新连接所有的目标文件。
make依靠Makefile文件完成。
在Linux系统中,习惯使用Makefile作为makefile文件。如果要使用其他文件作为makefile,则可利用下面make命令指令makefile文件:
#make -f Makefile.debug
Makefile是一个文本格式的数据库文件,包含一些规则,告诉make编译哪些文件,在什么条件下编译。
makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
makefile带来的好处就是—―自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make命令格式:
make [-f Makefile] [option] [target]
#make target
#make
#make clean
Makefile的格式
target ... :dependencies ...
command
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
dependencies就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令,可以有若干行)
Command必须以Tab键开头。否则,make就会显示出错信息。如果某一命令行太长可以分作两行,用反斜杠(\)连接
Make的工作流程
1、make会在当前目录下找名字为“makefile” 或“Makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),并将这个文件作为最终的目标文件。
3、如果目标文件不存在或目标文件所依赖的文件修改时间比目标文件新,那么就执行后面定义的命令,来生成这个目标文件。
4、如果目标文件所依赖的文件也存在,那么make会在当前文件中找目标文件的依赖性,如果找到则再根据那一个规则生成所依赖的文件。
5、make会一层又一层地找文件的依赖关系,直到最终编译出第一个目标文件。
一个简单的例子 edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c …… …… search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o
makefile中使用变量
在makefile中定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在makefile中执行的时候其会自动原模原样地展开在所使用的地方。
变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、 “#”、“=”或是空字符(空格、回车等)。
变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。
使用变量的makefile objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c 。。。。。。 。。。。。。 utils.o : utils.c defs.h cc -c utils.c clean : rm edit $(objects)
make自动推导
只要make看到一个[.o]文件
它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件
并且 cc -c whatever.c 也会被推导出来
于是,我们的makefile再也不用写得这么复杂。
最终可以变成 objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.h .PHONY : clean clean : rm edit $(objects) “.PHONY”表示,clean是个伪目标文件。