• Linux开发工具的使用


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

  • 相关阅读:
    搭建一个属于私人博客
    Python正则表达式的匹配规则
    CentOS 使用yum 安装node.js
    一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在有一个字典,用户输入一个单词,从字典找出这个单词有多少个兄弟单词
    Clion报错 CMake Error at CMakeLists.txt:1 (cmake_minimum_required): CMake 3.
    给定一个整数sum,从n个有序的元素的数组中寻找a,b,使得a+b的结果最接近sum,最快的时间复杂度?
    Go语言通过Docker Go语言SDK获取docker stats的信息
    通过GO程序获取docker version的基本信息
    Go语言实现通过Docker SDK获取docker ps 命令信息&SDK 中docker ps源码解析
    Docker监控docker stats命令的使用与返回参数的意思
  • 原文地址:https://www.cnblogs.com/lidabo/p/4548896.html
Copyright © 2020-2023  润新知