Linux开发工具的使用-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Linux开发工具的使用

简介: 1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.

 

 

 

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 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: