• vim

  • makefile

  • gdb

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    break function
    break lino
    break file.c:lino
    beak *0x844823
    info beakpointers
    clear location
    clear
    delete number
    delete
    watch expression
    rwatch expression
    awatch expression
    info watch
    next
    nexti
    step
    stepi
    stepi 4
    advance location
    continue
    jump location
    finish
    CTRL-C
    Enter
    display expression
    info display
    undisplay number
    print expression
    backtrace
    
  • g++

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    
    -o:指定生成的输出文件;默认输出为a.out。
    -E:仅执行编译预处理; 预编译后停下来,生成后缀为 .i 的预编译文件。
    -c:仅执行编译操作,不进行连接操作。编译后停下来,生成后缀为 .o 的目标文件。
    -S:将C代码转换为汇编代码; 汇编后停下来,生成后缀为 .s 的汇编源文件。
    -o:编译优化级别,级别为1~3,级别越大优化效果越好,但编译时间越长。
    -g:产生符号调试工具(GNU的 gdb)所必要的符号信息。想要对源代码进行调试,就必须加入这个选项。
    -lname:链接时装载名为 libname.a 的函数库。
    
    (1) -pedantic 选项
    当gcc在编译不符合ANSI/ISO C 语言标准的源代码时,将产生相应的警告信息
    
    From <http://blog.csdn.net/delphiwcdj/article/details/6555073> 
    
    (2) -Wall 选项
    除了 -pedantic 之外,gcc 还有一些其他编译选项,也能够产生有用的警告信息。这些选项大多以 -W 开头。其中最有价值的当数 -Wall 了,使用它能够使 gcc 产生尽可能多的警告信息。
    (3) -Werror 选项
    在处理警告方面,另一个常用的编译选项是 -Werror。它要求 gcc 将所有的警告当成错误进行处理,这在使用自动编译工具(如 Make 等)时非常有用。如果编译时带上 -Werror 选项,那么 gcc 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。
    (4) -Wcast-align 选项
    当源程序中地址不需要对齐的指针指向一个地址需要对齐的变量地址时,则产生一个警告。例如,char * 指向一个 int * 地址,而通常在机器中 int 变量类型是需要地址能被2或4整除的对齐地址
    (5) 其他常用选项
    -v                            输出 gcc 工作的详细过程
    --target-help       显示目前所用的gcc支持CPU类型
    -Q                           显示编译过程的统计数据和每一个函数名
    (三) 库操作选项
    在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。
    从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so 或 .a)的集合。虽然Linux下的大多数函数都默认将头文件放到 /usr/include/ 目录下,而库文件则放到 /usr/lib/ 目录下,但并不是所有的情况都是这样。正因如此,gcc 在编译时必须有自己的办法来查找所需要的头文件和库文件。常用的方法有:
    (1) -I 
    可以向 gcc 的头文件搜索路径中添加新的目录。
    (2) -L 
    如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 gcc 的库文件搜索路径中添加新的目录。
    (3) -l 
    Linux下的库文件在命名时有一个约定,就是应该以 lib 这3个字母开头,由于所有的库文件都遵循了同样的规范,因此在用 -l 选项指定链接的库文件名时可以省去 lib 这3个字母。例如,gcc 在对 -lfoo 进行处理时,会自动去链接名为 libfoo.so 的文件。
    (4) -static
    Linux下的库文件分为两大类,分别是:动态链接库(通常以 .so 结尾)和静态链接库(通常以 .a 结尾)。
    两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
    默认情况下,gcc 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。
    如果需要的话,可以在编译时加上 -static 选项,强制使用静态链接库。
    (5) -shared
    生成一个共享的目标文件,它能够与其他的目标一起链接生成一个可执行的文件。
    
    (四) 调试选项
    对于Linux程序员来讲,gdb(GNU Debugger)通过与 gcc 的配合使用,为基于Linux的软件开发提供了一个完善的调试环境。常用的有:
    (1) -g 和 -ggdb
    默认情况下,gcc 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使用 gcc 的 -g 或 -ggdb 选项。
    gcc 在产生调试符号时,同样采用了分级的思路,开发人员可以通过在 -g 选项后附加数字1、2、3指定在代码中加入调试信息的多少。默认的级别是2(-g2),此时产生的调试信息包括:扩展的符号表、行号、局部或外部变量信息。
    级别3(-g3)包含级别2中的所有调试信息以及源代码中定义的宏。
    级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储。
    回溯追踪:指的是监视程序在运行过程中函数调用历史。
    堆栈转储:则是一种以原始的十六进制格式保存程序执行环境的方法。
    
    注意:使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时的开销,因此,调试选项通常仅在软件的开发和调试阶段使用。
    
    (2) -p 和 -pg
    会将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息对于找出程序的性能瓶颈很有帮助,是协助Linux程序员开发出高性能程序的有力工具。
    
    (3) -save-temps
    保存编译过程中生成的一些列中间文件。
    # gcc test.c -o test -save-temps
    除了生成执行文件test之外,还保存了test.i 和 test.s 中间文件,供用户查询调试。
    
    (五) 交叉编译选项
    通常情况下使用 gcc 编译的目标代码都与使用的机器是一致的,但 gcc 也支持交叉编译的功能,能够编译其他不同CPU的目标代码。
    使用 gcc 开发嵌入式系统,我们几乎都是以通用的PC机(X86)平台来做宿主机,通过 gcc 的交叉编译功能对其他嵌入式CPU的开发任务。
    
  • Git

Git 面试题

169.说说你知道的 git 命令 170.git 如何查看某次提交修改的内容x

正则表达式

88.使用正则表达式匹配出

www.baidu.com中的地址 a=“张明 98 分”,用 re.sub,将 98 替换为 100 89.正则表达式匹配中(.)和(.?)匹配区别? 90.写一段匹配邮箱的正则表达式

简述正则表达式中?p的含义