分类: LINUX
2010-05-09 12:51:09
这是今天的工作,完毕.学无止境!
linux的程序设计与其它一样,主要涉及到编辑器(vi和Emacs),编译连接器(Gcc或G++),调试器(gdb)及项目管理工具(make).
编辑器(vi):分为命令行模式,输入模式,底行模式
vi的操作流程:vi 文件名-->进入命令行模式.按i -->进入输入模式.开始编写,再按Esc-->进入命令模式,再按":"-->进入底行模式,输入wq!
保存并退出!
vi的命令行模式功能键:
按键 功能
I 插入模式,在光标当前开始输入文本
A 插入模式,在光标当前行行尾开始输入文本
a 插入模式,在光标当前位位置后面开始输入文本
O 插入模式,在光标的前行插入A新的一行
ctrl + b 翻动后(下)一页
f 翻动前(上)一面
u 翻动后(下)半页
d 翻动前(上)半页
0(数字) 光标移到本行开头
G 光标移到最后
nG 光标移动到第n行
$ 光标移动到所在行的行尾
n(回车) 光标下移n行
/name 向光标前面查找
?name 向光标后面查找
X 删除光标后面的一个字符
nX 删除光标后面的n个字符
dd/D 删除光标所在行
ndd/nD 删除光标后面一n行
yy 复制光标所在行
nyy 复制光标后面的n行
p 粘贴缓冲区的字符到光标所在位置
U 撤销刚操作
插入模式就只有一个功能键.Esc 退出到命令行模式
底行模式常见功能:
按键 功能
w 保存
wq! 保存并退出vi
q! 强制退出
w 文件名 另保存为
set nu 显示行号
set nonu 取消行号
前面都是VI的操作.
下面也介绍Emacs ,它不仅仅是一款功能强大的编译器,而且是一款融合编辑,编译,调试于一体的开发环境.
Emacs 的功能键:
C- 代表按住Ctrl M- 代表按住Alt
键 功能
C-v 番动下一页
M-v 番动上一页
C-f 向前一个字符(光标后面一个字符)
C-b 向后一个字符
C-p 向前一行
C-n 向后一行
M-f 向前一个单词
M-b 向后一个单词
C-a 移动到行首
C-e 移动到行尾
M-a 移动到文本第一个字符
M-e 移动到文本最后一个字符
C-g 消掉它
C-u n C-P 重复n次C-p
M-w 复制
M-DELETE 剪切光标前面的单词
M-d 剪切光标前面的单词
C-k 剪切光标位置到行尾的内容
M-k 剪切光标位置到句尾的内容
C-y 粘贴缓冲区的内定到光标所在位置
C-x u 撤销操作(先操作C-x 接着再单击u)
C-d 删除光标字符
C-s 查找光标以后的内容,并在对话框的"I-search:" 后输入查找字符串
C-r 查找光标以前的内容,并在对话框的"I-search:" 后输入查找字符串
C-x C-s 保存文件
C-x C-c 退出文件
C-c C-c 注释(选择内容.再按C-c C-c,即可形成注释)
编译连接器:Gcc(GNU CC)
它其实就是四个步骤:预处理,编译,汇编,链接
Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项][目标文件];其中,目标文件可缺省,Gcc默认生成可执行的文件,命为:编译文件.out
预处理:Gcc -E heelo.c -o hello.i
编译:Gcc -S hello.i -o hello.s
汇编:Gcc -c hello.s -o hello.o
链接:Gcc hello.o -o hello
选项 功能
-c 只编译不链接,生成目标文件.o
-s 只编译不汇编,生成汇编代码
-E 只进行预编译,不做其它处理
-g 在可执行程序中包含标准调试信息
-o file 输出指定文件
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir(指路径) 在头文件的搜索路径表中添加dir目录 如:Gcc hello.c -I /root/Gcc/ -o hello
注:在include 语句中,<>表示在标准路径中搜索头文件,""表示在本目录中搜索,如果用"",就不需要加上-I选项
-L dir(指路径) 在头文件的搜索路径表中添加dir目录 如:Gcc hello.c -L /root/Gcc -lsunq -o hello
注:在linux 下,必须以lib 3个字母开头。-lsunq = libsunq(自动去链接此文件)
-static 链接静态库
-llibrary 链接名为library的库文件
告警和出错选项
-ansi 支持符合ANSI标准的C程序 如:Gcc -ansi hello.c -o hello 强制生成标准语法所要求的告警信息,但不
能 保证所有没有警告的程序都是符合ANSI C标准的
-pedantic 允许发出ANSI C 标准所列的全部警告信息-->保证所有没有警告的程序都是符合ANSI C标准的
-pedantic-error 允许发出ANSI C 标准所列的全部错误信息
-w 关闭所有告警
-Wall 允许发出Gcc提供的所有有用的报警信息-->保证所有没有警告的程序都是符合ANSI C标准的
-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
优化选项:-O1..3:一般只有当程序在最终发行的时候才考虑对其进行优化
体系结构选项:它在嵌入式的设计中会有较多的应用,可以根据不同体系结构将对应的选项进行组合处理。
-mcpu=type 针对不同的CPU使用相应的CPU指令,可选择type有i386 i486 pentium及i686等
-mieee-fp 使用IEEE标准进行了浮点数的比较
-mno-ieee-fp 不使用IEEE标准进行浮点数的比较
-msoft-float 输出包含浮点库调用的目标代码
-mshort 把int类型作为16位处理,相当于short int
-mrtd 强制将函数参数个数固定的函数用ret_NUM返回,节省调用函数的一条指令
Gdb调试器
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以
后,让我们来看看如何用gdb来调试他,这样编译出的可执行代码中才包含调试信息!
一般步骤:Gdb 执行文件(启动Gdb,记得生成执行文件时带-g)-->l(list显示出刚加载的文件,再按回车或者l 继续显示)-->b 段号/函数名
(breakpoint设置断点)-->info b(查看断点信息)-->r(run 运行到继点处)-->p 变量(查看变量值)-->n/s(不同在于s能进入函数,单步执
行)-->finish 退出函数执行-->c(continue 继续运行程序)-->q 退出gdb
Gdb的基本命令之工作环境相关命令:
命令 功能
set args 运行的参数 指定运行时参数,如set args 2
show args 查看设置好的运行参数
path dir 设定程序的运行路径
show paths 查看程序的运行路径
set enVironment var [=value] 设置环境变量
show enVironment[var] 查看环境变量
cd dir 进入到dir目录,相当于shell中的cd命令
pwd 显示当前工作目录
shell command 运行shell的command 命令
Gdb的基本命令之设置断点与恢复命令:
命令 功能
info b 查看断点
break 行号/函数名<条件表达式> 设置断点 格式:b 行数或者函数名 if 表达式 如 b 8 if i==10
tbreak 行号/函数名<条件表达式> 设置临时断点,到达后自动删除
delete [断点号] 删除指定断点,缺省就删除所有断点
disable [断点号] 停止断点,缺省就停止所有断点
enable [断点号] 激活指定断点
condition [断点号] <条件表达式> 修改对应断点的条件
ignore [断点号]
step 单步恢复程序运行,且进入函数调用
next 单步恢复程序运行,且不进入函数调用
finish 运行程序,一直到当前函数完成返回
c 继续执行函数,直到函数结束或者遇到新的断点
Gdb的基本命令之源码查看命令:
命令 功能
list <行号>|<函数名> 查看指定位置代码
file [文件名] 加载指定文件
forward-search 正则表达式 源代码前向搜索
reverse-search 正则表达式 源代码后向搜索
dir dir 停止路径名
show directories 显示定义了的源文件搜索路径
info line 显示加载到Gdb内在中的代码
Gdb的基本命令之查看运行数据命令:指当程序处于"运行"或"暂停"状态时,可以查看的变量及表达式的信息
命令 功能
print 表达式|变量 查看程序运行时对应表达式的和变量的值
x
display 表达式 设定在单步运行或者其他情况中,自动显示的对应表达式的内容
Make 工程管理器
Makefile 是Make读入的唯一配置文件.
编写Makefile的规则中通常包含:
需要由make工具创建的目标体(targer),通常是目标文件或可执行文件;
要创建的目标体所依赖的文件(dependency_file);
创建每个目标体时需要运行的命令(command);
格式:targat:dependency_file
[tab]command
如:hello.o:hello.c hello.h
gcc -c hello.c -o hello.o
再运行make hello.o
makefile有二种定义变量的方式:一种是递归展开方式,一种是简单方式
递归式:VAR = var
简单式:VAR = var
makefile中的变量使用均格式为:$(VAR)
例子:OBJS = kang.o yul.o
CC - Gcc
GFLAGS = -wALL -O -g
sung : $(OBJS)
$(CC) $(OBJS) -o -sung
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.cyul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
makefile 中还有其它变量,
预定义变量:
命令 功能
AR 库文件维护程序的名称,默认值为ar
AS 汇编程序的名称,默认值为as
CC C编译器的名称,默认值为cc
CPP C预编译器的名称,默认$(CC)-E
CXX C编译器的名称,默认值为g++
FC FORTARN 编译器的名称,默认值为f77
RM 文件删除程序的名称,默认值为rm -f
ARFLAGS 库文件维护程序的选项,无默认值
ASFLAGS 汇编程序的选项,无默认值
CFLAGS C编译器的选项,无默认值
CPPFLAGS C预编译的选项,无默认值
CXXFLAGS C++编译器的选项,无默认值
FFLAGS FORTRAN 编译器的选项,无默认值
可以看出,上例中的CC和CFLAGS是预定义变量,其中由于CC没有采用默认值,因此,需要把"CC=Gcc"明确列出来
我们常见的自动变量,它可以代表编译语句中出现目标文件和依赖文件等,并具有本地含义(即下一语句中出现的相同变量 代表的是下一语句
的目标文件和依赖文件)
命令 功能
$* 不包含扩展名的目标文件名称
$+ 所有依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间截比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成名称
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
$(CC) &(CFLAGS) -c $< -o $@
makefile的规则是make进行处理的依据它包括了目标体,依赖文件及其之间的命令语句.
make还定义了隐式规则和模式规则!
隐式规则能告诉MAKE怎样使用传统的技术完成任务,就是它仅仅能够用MAKE默认的变量来进行操作!
模式规则是用来定义相同处理规则的多个文件,还能引用用户自定义变量!
隐式规则有:
对应语言后缀名 规则
c编译:.c变成.o $(CC) -C $(CPPFLAGS) $(CFLAGS)
c++编译:.cc/.C变成.o $(CXX) -C $(CPPFLAGS) $(CXXFLAGS)
Pascal编译: .P变成.o $(PC) -C $(PFLAGS)
Fortran编译: .r变成.o $(FC) -C $(FFLAGS)
隐式规则与模式规则:
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
make管理器的使用
命令 功能
-C dir 读入指定目录下的Makefile
-f file 读入当前目录下的file文件作为Makefile
-i 忽略所有的命令执行错误
-I dir 指定被包含的Makefile所在目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示make变量数据库和隐含规则
-s 在执行命令时不显示命令
-w 如果make在执行过程中改变目录,则打印当前目录名
autotools 使用它只需要用户输入简单的目标文件,依赖文件,文件目录就可以轻松地生成Makefile!
做个例子就不用多说了.看了就会.不会做多几次,一定能理解!
先建个文件:hello.c
#inluce
int main()
{
printf("Hello.World!!\n");
return 0;
}
第一步:在这文件的目录下,输入命令:autoscan ,这样就会生成configure.scan(configure.in的原文件)和autoscan.log !
第二步:然后输入vi configure.scan ,将它修改成下面例子,退出保存:w configure.in
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(hello,1.0)
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([hello.c])
AM_CONFIG_HEADER([config.h])
AC_CONFIG_FILES([Makefile])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT()
说明:
1、以“#”号开始的是行为注释。
2、AC_PREREQ宏声明本文件要求的autoconf版本。
3、AC_INIT宏用来定义软件的名称和版本等信息,这里的BUG-REPORT-ADDRESS可以省略。
4、AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。这个参数一般不需要修改。
5、AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
6、加上AC_CONFIG_FILES([Makefile]),这是用于生成相应的Makefile文件。
修改时需要增加一个宏AM_INIT_AUTOMAKE(PACKAGE,VERSION),还要把AC_CONFIG_HEADER更改为AM_CONFIG_HEADER。
第三步:aclocal 它生成一个aclcal.m4文件
再输入:autoconf 它生成configure文件
再输入:autoheader 它生成config.h.in文件
第四步:这是很重要的一步。automake需要的脚本配置文件是Makefile.am,这个文件需要自己建立。使用automake对其生成configure.in文
件。
vi Makefile.am 文件内存如下
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
说明:
AUTOMAKE_OPTIONS为设置automake的选项。automake提供了3种软件等级:foreign、gnu、gnits,让用户选择使用,默认等级是gnu。现在使
用的foreign只是检测必要的文件。
bin_PROGRAMS定义了要产生的执行文件名。如果产生多个可执行文件,每个文件名用空格隔开。
file_SOURCES定义file这个执行程序的依赖文件。同样的,对于多个执行文件,那就要定义相应的file_SOURCES。
这里可以使用选项--adding-missing让automake自动添加一些必要的脚本文件。
第五步:automake --adding-missing
最后,使用 make来对其目录生成可执行文件hello
使用 make dist 打包程序
还可以用 make install 来安装
在前面学过使用linux 再复习c 现在理解linux下编程方法,