Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130755
  • 博文数量: 36
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 17:33
文章分类
文章存档

2011年(18)

2010年(18)

我的朋友

分类: 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 [断点号]                     在程序执行中,忽略对就断点num次
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下编程方法,

阅读(1394) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-15 15:14:09

强制目录复制 #\cp -rf

chinaunix网友2010-10-13 10:48:49

ctrl+# 亮光 :noh 取消亮光