Linux的VI,GCC,GDB,Makefile等简单应用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例:
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
等价于
hello:main.o func1.o func2.o
gcc $^ -o $@
&&&&&&&&&&&&&&&&&&&&&【杂项】&&&&&&&&&&&&&&&&&&&&&
-->".PHONY"将"clean"目标声明为伪目标
&&&&&&&&&&&&&&&&&&&&&【添加变量】&&&&&&&&&&&&&&&&&&&&&
例:
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
若采用变量,则:
x. -Wall 生成所有警告信息
xi. -w 不生成任何警告信息 例如:gcc -w hello.c -o hello
xii. -D宏名 如-DPI 定义宏PI,等价于在程序中使用#define PI
[filename]要编译的文件名
3、GDB代码调试【非常重要】
$$$GDB主要完成如下三个方面的功能$$$
quit(q) 退出GDB
4、Makefile简介
&&&&&&&&&&&&&&&&&&&&&【规则】&&&&&&&&&&&&&&&&&&&&&
targets:prerequisites 目标:依赖 main.o:main.c
command 命令 gcc -c main.c
make -f 文件名
&&&&&&&&&&&&&&&&&&&&&【伪目标】&&&&&&&&&&&&&&&&&&&&&
makefile中把那些没有任何依赖只有执行动作的目标成为“伪目标”(phony targets)
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
·:w[filename] 另存为filename的文件
·:set nu 显示行号
·:set nonu 取消行号
2、GCC编译器的使用【非常重要】
基本用法:
格式:gcc [options][filename]
参数:
[options]编译器所需要的编译选项
i. -o output_filename 生成的可执行文件的名称
1、vi文本编辑器的使用【熟练掌握,非常重要】
i.三种模式:
a.命令行模式【其他模式下按Esc切换到此模式】
默认模式。该模式下可以移动光标进行浏览,整行删除,但无法编辑文字;
b.插入模式【命令行模式下,按i切换到此模式】
此模式下,用户才可以编辑文本;
c.底行模式【在命令行模式下按:号切换到此模式】
·/name: 查找光标之后的名为"name"的字符串
·G: 光标移动到文件尾(大写字母)
·U: 取消前一个动作(大写字母)
iii.底行模式的一些功能键:
·:w 保存
·:q 退出vi(系统会提示保存修改)
·:q! 强制退出(对修改不做保存)
·:wq 保存后退出(加上!号就变成强制动作了)
此模式下,用户可以进行保存/退出等操作,也可以寻找字符串/列出行号等。
ii.命令行模式的一些功能键:
·yy: 复制当前光标所在行
·[n]yy: 复制当前光标开始的n行
·p: 粘贴复制的内容到光标所在行
·dd: 删除当前光标所在行
·[n]dd: 删除当前光标所在行开始的n行
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
当使用静态库时,链接器找出程序所需的函数,然后将它们拷贝到可执行文件。一旦链接成功,静态
程序库也就不再需要了。
对于动态库,会在执行程序内部留下一个标记,指明当程序执行时,首先必须载入这个库。
由于动态库节省空间,所以Linux下进行链接的【缺省操作】首先链接【动态库】。
*************************!!!!!!!!!!!!!!!!!!***********************************
***注意!command前面是Tab,表示命令的开始***
&&&&&&&&&&&&&&&&&&&&&【指定makefile的文件名】&&&&&&&&&&&&&&&&&&&&&
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为
这两者之一时,可以用如下方法指定
makefile中以"#"作为注释
hello:hello.c
@gcc hello.c -o hello
其中的"@"表示【取消回显】,意思就是make命令之后不再显示"gcc hello.c -o hello"这一行了
&&&&&&&&&&&&&&&&&&&&&【一个完整的例子】&&&&&&&&&&&&&&&&&&&&&
iii. 在main函数处设置断点:
break main
iv. 运行程序:
run
&操作指南
list 显示程序(显示之后就可以看到行号了)
break(b) 函数名 在某函数入口处添加断点
break(b) 行号 在指定行添加断点
break(b) 文件名:行号 在指定文件的指定行添加断点
run(r) 开始运行程序
next(n) 单步运行程序(不进入子函数)
step(s) 单步运行程序(进入子函数)
continue(c) 继续运行程序
print(p) 变量名 查看指定变量值
finish 运行程序,直到当前函数结束
watch 变量名 对指定变量进行监控
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c
a.启动被调试程序;
b.让被调试的程序在指定的位置停住;
c.当程序被停住时,可以检查程序状态(如变量值)
$$$GDB的用$$$
&应用顺序:
i. 编译生成可执行文件:
gcc -g hello.c -o hello
ii. 启动GDB:
gdb hello
obj=main.o func1.o func2.o
hello:$(obj)
gcc $(obj) -o hello
如果想在依赖中添加文件,直接加到obj里面就行了
在makefile中,存在系统【默认的自动化变量】
$^ 代表所有的依赖文件
$@ 代表目标
$< 代表第一个依赖文件
vi. -I dirname 将dirname所指出的目录加入到程序头文件目录列表汇中。默认库在/usr/include/ 文件下
例如 gcc my_test.c -I /home/include -o my_test
vii. -L dirname 将dirname所指出的目录加入到库文件的目录列表中。默认库文件在/usr/lib 路径下
ii. -c 只编译,不链接成为可执行文件,即把.c源文件生成为.o的目标文件
iii. -g 产生调试工具(GDB)所必要的符号信息。想用GDB调试代码,必须有此选项
iv. -O 对程序进行优化编译、链接。优化处理后所产生的可执行文件的执行效率可以提高,但编译链接相应耗时增加
v. -O2 比-O更优化,但更耗时
这个选项告诉链接程序,寻找库文件时,首先到-L指定的目录去找,然后再到系统预设路径去寻找。
viii. -lname 在链接时,装载名字为"libname.a"的函数库。该函数库位于系统预设的目录或者由-L选项
确定的目录下。例如,-lm表示链接名为"libm.a"的数学函数库。
例子 gcc test.c -L /home/lib -ltest -o test
break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,例如
b 5 if i=10,当i==10时第5行断点生效
info break 查看所有设置的断点
delete 断点编号 删除断点(先用info break列出断点号)
*************************!!!!!!!!!!!!!!!!!!***********************************
ix. -static 静态链接库文件
例子 gcc -static hello.c -o hello
【动态库与静态库】
动态库常用.so为后缀,静态库常用.a为后缀
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
等价于
hello:main.o func1.o func2.o
gcc $^ -o $@
&&&&&&&&&&&&&&&&&&&&&【杂项】&&&&&&&&&&&&&&&&&&&&&
-->".PHONY"将"clean"目标声明为伪目标
&&&&&&&&&&&&&&&&&&&&&【添加变量】&&&&&&&&&&&&&&&&&&&&&
例:
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
若采用变量,则:
x. -Wall 生成所有警告信息
xi. -w 不生成任何警告信息 例如:gcc -w hello.c -o hello
xii. -D宏名 如-DPI 定义宏PI,等价于在程序中使用#define PI
[filename]要编译的文件名
3、GDB代码调试【非常重要】
$$$GDB主要完成如下三个方面的功能$$$
quit(q) 退出GDB
4、Makefile简介
&&&&&&&&&&&&&&&&&&&&&【规则】&&&&&&&&&&&&&&&&&&&&&
targets:prerequisites 目标:依赖 main.o:main.c
command 命令 gcc -c main.c
make -f 文件名
&&&&&&&&&&&&&&&&&&&&&【伪目标】&&&&&&&&&&&&&&&&&&&&&
makefile中把那些没有任何依赖只有执行动作的目标成为“伪目标”(phony targets)
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
·:w[filename] 另存为filename的文件
·:set nu 显示行号
·:set nonu 取消行号
2、GCC编译器的使用【非常重要】
基本用法:
格式:gcc [options][filename]
参数:
[options]编译器所需要的编译选项
i. -o output_filename 生成的可执行文件的名称
1、vi文本编辑器的使用【熟练掌握,非常重要】
i.三种模式:
a.命令行模式【其他模式下按Esc切换到此模式】
默认模式。该模式下可以移动光标进行浏览,整行删除,但无法编辑文字;
b.插入模式【命令行模式下,按i切换到此模式】
此模式下,用户才可以编辑文本;
c.底行模式【在命令行模式下按:号切换到此模式】
·/name: 查找光标之后的名为"name"的字符串
·G: 光标移动到文件尾(大写字母)
·U: 取消前一个动作(大写字母)
iii.底行模式的一些功能键:
·:w 保存
·:q 退出vi(系统会提示保存修改)
·:q! 强制退出(对修改不做保存)
·:wq 保存后退出(加上!号就变成强制动作了)
此模式下,用户可以进行保存/退出等操作,也可以寻找字符串/列出行号等。
ii.命令行模式的一些功能键:
·yy: 复制当前光标所在行
·[n]yy: 复制当前光标开始的n行
·p: 粘贴复制的内容到光标所在行
·dd: 删除当前光标所在行
·[n]dd: 删除当前光标所在行开始的n行
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
当使用静态库时,链接器找出程序所需的函数,然后将它们拷贝到可执行文件。一旦链接成功,静态
程序库也就不再需要了。
对于动态库,会在执行程序内部留下一个标记,指明当程序执行时,首先必须载入这个库。
由于动态库节省空间,所以Linux下进行链接的【缺省操作】首先链接【动态库】。
*************************!!!!!!!!!!!!!!!!!!***********************************
***注意!command前面是Tab,表示命令的开始***
&&&&&&&&&&&&&&&&&&&&&【指定makefile的文件名】&&&&&&&&&&&&&&&&&&&&&
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为
这两者之一时,可以用如下方法指定
makefile中以"#"作为注释
hello:hello.c
@gcc hello.c -o hello
其中的"@"表示【取消回显】,意思就是make命令之后不再显示"gcc hello.c -o hello"这一行了
&&&&&&&&&&&&&&&&&&&&&【一个完整的例子】&&&&&&&&&&&&&&&&&&&&&
iii. 在main函数处设置断点:
break main
iv. 运行程序:
run
&操作指南
list 显示程序(显示之后就可以看到行号了)
break(b) 函数名 在某函数入口处添加断点
break(b) 行号 在指定行添加断点
break(b) 文件名:行号 在指定文件的指定行添加断点
run(r) 开始运行程序
next(n) 单步运行程序(不进入子函数)
step(s) 单步运行程序(进入子函数)
continue(c) 继续运行程序
print(p) 变量名 查看指定变量值
finish 运行程序,直到当前函数结束
watch 变量名 对指定变量进行监控
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c
a.启动被调试程序;
b.让被调试的程序在指定的位置停住;
c.当程序被停住时,可以检查程序状态(如变量值)
$$$GDB的用$$$
&应用顺序:
i. 编译生成可执行文件:
gcc -g hello.c -o hello
ii. 启动GDB:
gdb hello
obj=main.o func1.o func2.o
hello:$(obj)
gcc $(obj) -o hello
如果想在依赖中添加文件,直接加到obj里面就行了
在makefile中,存在系统【默认的自动化变量】
$^ 代表所有的依赖文件
$@ 代表目标
$< 代表第一个依赖文件
vi. -I dirname 将dirname所指出的目录加入到程序头文件目录列表汇中。默认库在/usr/include/ 文件下
例如 gcc my_test.c -I /home/include -o my_test
vii. -L dirname 将dirname所指出的目录加入到库文件的目录列表中。默认库文件在/usr/lib 路径下
ii. -c 只编译,不链接成为可执行文件,即把.c源文件生成为.o的目标文件
iii. -g 产生调试工具(GDB)所必要的符号信息。想用GDB调试代码,必须有此选项
iv. -O 对程序进行优化编译、链接。优化处理后所产生的可执行文件的执行效率可以提高,但编译链接相应耗时增加
v. -O2 比-O更优化,但更耗时
这个选项告诉链接程序,寻找库文件时,首先到-L指定的目录去找,然后再到系统预设路径去寻找。
viii. -lname 在链接时,装载名字为"libname.a"的函数库。该函数库位于系统预设的目录或者由-L选项
确定的目录下。例如,-lm表示链接名为"libm.a"的数学函数库。
例子 gcc test.c -L /home/lib -ltest -o test
break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,例如
b 5 if i=10,当i==10时第5行断点生效
info break 查看所有设置的断点
delete 断点编号 删除断点(先用info break列出断点号)
*************************!!!!!!!!!!!!!!!!!!***********************************
ix. -static 静态链接库文件
例子 gcc -static hello.c -o hello
【动态库与静态库】
动态库常用.so为后缀,静态库常用.a为后缀