1. Linux开发工具的使用
Vim编译的使用
Ibm的Vim 实用技术
http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html
http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html
http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/index.html
l 跳转命令:
^,$ 光标移动至行首、行尾
(,) 一句话的最前面、最后面
{,} 一个段落的最前面、最后面
H 跳到第一行
M 跳到中间一行
L 跳到最后一行
gg 跑到文件开头
G 跑到文件结尾
查找命令
/?查询, s/查找内容/替换内容
编辑命令
复制: y复制选择的内容、yy复制一行、nyy复制n行
剪贴 d
粘贴: p; ]p代码粘贴
删除: d删除选择的内容、dd删除一行、dw删除一个单词
取消: u
更改: cw更改光标所在位置的一个字
删除或称谓剪贴
db 删除到某个单词的开始位置
d) 删除到某个语句的结尾位置
d( 删除到某个语句的开始位置
d} 删除到某个段落的结尾位置
d{ 删除到某个段落的开始位置
D 删除到某一行的结尾=d$
修改
cl 更改当前字符(等于先按x再按i)
cw 修改到某个单词的结尾位置(dw再i)
cb 修改到某个单词的开始位置(db再i)
<< 代码向前移动
>> 代码向后移动
窗口命令
:split/vsplit 分隔一个窗口
:new/vnew 创建一个新的窗口
:sf 文件名 在新窗口中打开filename
:only 关闭除当前窗口外所有窗口
:ctrl-w 可进行切换窗口
:ctrl-w h 到左面的窗口
:ctrl-w l 到右面的窗口
:ctrl-w j 到下面的窗口
:ctrl-w k 到上面的窗口
set paste //在粘贴之前使用该命令, 就不会在粘贴的时候将格式搞乱,粘贴之后再使用set nopaste即可将自动格式命令打开
set complete+=k // 自动完成?
setlocal omnifunc=syntaxcomplete#Complete //"打开语法打开补全
dw,剪切单词。d$,剪切到行尾。d0,剪切到行首。[n]dd,剪切一行或下面n行。
yw,复制单词。y$,复制到行尾。y0,复制到行首。[n]yy,复制一行或下面n行。
写代码的时候的快捷键:
]p:和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。
gd:定位到局部变量声明处
K:在 Man 里面查找光标当前所在处的词,显示光标下的C函数的man说明手册
^P/^n 自动完成功能;如果没有合适的就一直按C-P/N
^]:显示~/.tags中的光标下的函数的原型,
^t:退出函数的原型窗口
在编译一个文件时候同时打开另外一个文件
:sp [filename]
CTRL-W h 跳转到左边的窗口
CTRL-W j 跳转到下面的窗口
CTRL-W k 跳转到上面的窗口
CTRL-W l 跳转到右边的窗口
生成C语言标准函数库的tag文件
ctags -R -f ~/.vim/systags --c-kinds=+p --fields=+S /usr/include /usr/local/include
再在.vimrc加上 ctags+=~/.vim/systags
这样每次生成ctags只生成本工程下的,但使用时却又能包括标准接口。
$ctags -R * (将当前目录和子目录中的文件生成tag)
$vi -t find (在目录中查询find函数)
:ts find (查看find函数)
:ta find (查看find函数)
Gdb调试工具的使用
gdb代码调试参考
http://fanqiang.chinaunix.net/program/other/2005-03-23/2993.shtml
1. 设置断点
(gdb)b test.c:17 //表示在17行设置断点
(gdb)b test.c:func //表示在test.c文件中func函数开始的地方设置断点
(gdb)b test.c:21 if result==20 //断点的触发的条件是result==20
(gdb)info b //查看断点的信息
(gdb)delete、enable、disable、clear、// 维护断点
run[r]//运行
continue[c] //继续运行
next[n] //下一条语句;不会进出函数内部
step[s] //会进出调用的函数内部
finish //退出函数
注意:在输入b按两次tab键,会列出所有以b开头的命令
2. 查看断点变量内容
backtrace[bt]//打印当前的函数调用栈的所有信息
bt n //是一个正整数,表示只打印栈顶上n层的栈信息
//-n表一个负整数,表示只打印栈底下n层的栈信息
frame(f) n //表示查看当前栈某层信息
info f //打印出更为详细的当前栈层的信息;
info args //打印出当前函数的参数名及其值
info locals //打印出当前函数中所有局部变量及其值
info catch //打印出当前的函数中的异常处理信息
@ //操作数组
(gdb)p/c *array@10 //打印array后面10个字符的内容,按照字符查看
(gdb)p/x *array@10 //按照16进制查看
(gdb)p this //查看this的数据
:: //指定某文件、类、函数中的变量
(gdb)p "test.c"::m_test //查看test.c文件中的变量
{} //一个内存地址为type的对象
3.查看源代码
(gdb)l n,fun //显示程序第n行或某函数周围的代码
(gdb)l CTest::get_count //查看CTest类中get_count函数
Makefile的编写
make的基本介绍[Makefile]
make是一个有规则的文本文件,每个规则由三部分组成:目标、依赖文件、命令列表
target: dep1 dep2 dep3 ...
command1
command2
......
注意:每个命令前面是制表符不能用空格代替!
例如:
ipphone : ipphone.o
gcc -o ipphone ipphone.o
ipphone.o: ipphone.c ipphone.h
gcc -c ipphone.c
ctl: ctl.o
gcc -o ctl ctl.o
ctl.o: ctrl.c ipphone.h
gcc -c ctl.c
上面有四个规则;如果make命令行中没有包含规则名就会检查所有的规则,如果有则只检查该规则,例如只想生成ctl文件需要make ctl即可!
伪目标
例如:all: ctl ipphone //这是因为all并不存在它只是检查ctl和ipphone作用
例如:clean: rm -f *.o //由于没有依赖文件所以缺省不会执行,可通过 make clean执行
make定义变量和使用变量
为了make文件的编辑和维护更方便,可在make中定义变量、和shell一样;make文件中的变量内容实际是一个字符串,定义和使用规则同shell差不多。
CC=gcc -c 使用的时候和shell类似用括号扩起来前面加$;$(CC)
变量定义时候引用了自己make会递归展开引发错误:
make提供的只读变量:
$@ 目标文件名
$< 第一个相关的文件名
$^ 相关文件列表、以空格分开
$? 新于目标文件的相关文件列表
$(@D) 目标文件名的目录部分
$(@F) 目标文件名的文件名部分
make预定义变量:
AS 汇编器
CC C编译器,缺省cc
CPP C预处理器,缺省值cpp
RM 文件删除程序,缺省rm -f
隐含规则和规则模式
例如:ipphone : ipphone.o
gcc -o ipphone ipphone.o
该规则没有指出ipphone.o怎么得来,这就适合隐含规则make会自动使用
gcc -c ipphone.c -o ipphone.o命令生成ipphone.o文件。这个规则也可通过%.o : %.c重新定义、表示所有的.o文件都是通过.c文件编译而来;或者通过下面的方式重定义:
%.o : %.c
$(CC) -c $< -o $@ //表示使用第一个相关的文件名来生成目标文件名
make命令行的选项:
-f 指定make文件名不适用缺省值
-n 显示所有要执行的命令,但不执行
-s 执行时不显示命令
-r 禁止make内部规则
-d 显示调试信息
-i 忽略规则的命令错误,继续执行
-k 忽略模块编译错误、继续下面的编译
编译的参数
参数信息
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
基本写法
filestat: filestat.o
gcc filestat.o -o filestat
filestat.o:
gcc -c filestat.c
clean:
rm -fr *.o *~ *.*~ filestat
----------------------------------------------
改善之后的写法
object = filestat.o // 使用目标文件
cc = gcc // 编译器定义
cflags = -Wall -O -g // 编译条件
filestat: $(object) // 由.o文件连接成 程序文件
$(cc) $(object) -o filestat
filestat.o: // 由.c文件编译成 目标文件
$(cc) $(cflag) -c filestat.c -o filestat.o
clean:
rm -fr *.o *.*~ *~ filestat
----------------------------------------------optimization
cc = gcc
cflag = -Wall -O -g
TARGET = ./filestat
OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c)) //将当前路径中所有.c文件扩展替换为
wildcard( %.c); #将目录中所有以.c后缀的文件名,存入一个列表变量中
patsubst( %.c, %.o, listvar); #表示将listvar中所有以.c为后缀的文件,改为以.o为后缀文件
%.o: %.c
$(cc) $(cflag) -c $< -o $@ //采用gcc -cflag -c第一个相关联的文件 -o 目标文件
$(TARGET): $(OBJECTS)
$(cc) $(OBJECTS) -o $(TARGET) //将当前.o文件连接成目标程序文件
chmod a+x $(TARGET)
subsystem:
cd subdir && $(MAKE) // 进入子目录进行make
clean:
rm -fr *.o $(TARGET) *~
======================================================
在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件
建立一个简单的makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
obj2=$(dir:%.c=%.o)
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo $(obj2)
@echo "end"
第一行输出:wildcard把指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
a.c b.c ./sub/sa.c ./sub/sb.c
第二行输出:notdir把展开的文件去除掉路径信息
a.c b.c sa.c sb.c
第三行输出:patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
a.o b.o sa.o sb.o
第四行输出:把变量dir中的每一个值结尾用o替换掉c
a.o b.o sa.o sb.o
linux跟踪调试
-Wall 使用它能够使GCC产生尽可能多的警告信息
1、Linux下的大多数函数都默认:
头文件放到/usr/include/目录下
而库文件则放到/usr/lib/目录下
-I 选项:增加头文件目录
-L 选项:增加库文件目录
gdb调试程序
1.显示数据:print或p 变量print *指针
2.查看数组:人为数组:查看内存中变量h后面的10个整数: print h@10
3.设置断点:b line-or-func if testvalue==100
显示断点:info b
删除断点:delete b 1
4.执行:
next:单步执行
setp:进入一个内部函数
finish:跳出该内部函数
list列出下面要执行的源代码
run 开始调试程序
set 变量//给该变量赋值
pype 显示一个数据结构的内容(C的结构或函数)
p/x i //按16进制显示变量内容,/c按字符/
x/ //examine简拼为x,n是内存的长度,f 表示显示的格式,u 表示从当前地址往后请求的字节数
x/3uh 0x54320//表示查看0x54320后面3个字节长度按照无符号
自动显示:
display
display/
display/
SSH的使用
Linux与Linux之间传送文件:
scp LocalFile username@remoteIP:[path or remoteFile]
scp p2p-tracker root@124.127.108.231:/usr/share/p2p-tracker/
subversion的使用
安装subversion
sudo apt-get install subversion subversion-tools
1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain #表示将url中的文件checkout到本地
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php) #将test.php添加到svn上面,其路径是当前目录所在svn路径
#add之后commit才能真正将文件加入到svn上面
3、将改动的文件提交到版本库
svn commit -m "LogMessage"
例如:svn commit -m "add file" test.php #只提交test.php文件
例如:svn ci #提交当前目录所有的文件
4、加锁/解锁
svn lock -m "LockMessage" [--force] PATH
例如:svn lock -m "lock test file" test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
svn delete path -m "delete test fle"
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m "delete test file"
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
svn info path
例如:svn info test.php
10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面写几个不经常用的
——————————————————————————
13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH…
2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)