zoukankan      html  css  js  c++  java
  • 【C编程基础】C编译链接命令gcc

    1.gcc安装

    rpm -qa|grep gcc    ==>检查gcc是否安装
    gcc -v              ==>检查gcc版本
    yum -y install gcc  ==>安装gcc

     2.基本语法

    gcc最基本的用法是:gcc [options] [filenames]

    说明:如果已经为最新的目标文件,则不重新编译。使用示例test.c源码如下:

    #include <stdio.h>
    int main(void)
    {
        printf("Hello world/n");
        return 0;
    }

    (1)编译-c

    gcc -c test.c             ==>编译不链接生成目标文件test.o
    gcc -c test.c -o test.o   ==>同上
    gcc -c -o test.o test.c   ==>同上

    (2)链接-o

    gcc  test.o -o test==>链接生成可执行文件test

    (3)编译链接-o

    gcc test.c -o test         ==>编译链接生成可执行文件test

    (4)代码优化-O和引用头文件目录-I

    gcc –c –O –I dirname test.c  ==>使用系统库则不用特意指出/usr/lib和/lib

    (5)函数库引用-lname

     -lname 链接时装载名为 libname.a 的函数库。例如,-lm 表示链接名为 libm.a 的数学函数库。

    gcc test.c testsub.c -lm -o test

    补充:自定义函数库(打包中间目标文件)ar命令

    如果需要链接中间目标文件太多,链接时需要明显地指出所有中间目标文件名,十分不便。可以给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件静态库。

    PS:我们可以使用中间目标文件(O文件或是OBJ文件)或静态库文件来链接我们的应用程序。

    ar crv libtest.a *.o  ==>将该目录下的所有目标文件打包生成了libtest.a文件静态库

    3.警告信息选项

    使用示例main.c源文件如下:

    #include <stdio.h>  
      
     void main(void)  
     {  
         long long int var = 1;  
         printf("It is not standard C code!/n");  
     }

    (1)-pedantic 

    当gcc在编译不符合ANSI/ISO C 语言标准的源代码时,将产生相应的警告信息。

    执行语句 gcc -pedantic main.c -o main

     (2)-Wall

    使 gcc 产生尽可能多的警告信息,建议在用 gcc 编译源代码时始终带上 -Wall 选项

    执行语句 gcc -Wall main.c -o main

    (3)-Werror

    gcc 将所有的警告当成错误进行处理,产生警告地方停止编译,这在使用自动编译工具(如 Make 等)时非常有用。

    执行语句 gcc -Werror main.c -o main

    (4)-w

    关闭任何以W开头的警告信息,,建议不要使用此项。

    执行语句 gcc -w main.c -o main

    4.使用gdb进行调试

    gdb是Linux下一款功能强大的调试工具。默认情况下,gcc 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使用 gcc 的 -g 或 -ggdb 选项。

    (1)gdb功能

    设置断点

     监视程序变量的值

    l程序的单步执行

     显示、修改变量的值

     显示、修改寄存器

     查看程序的堆栈情况

     远程调试

    (2)gdb调试过程

    a.程序经过预处理后,即进入编译阶段,进入编译阶段,首先声明编译:

    b.格式:gdb test.c -o test -g

    c.进入编译:gdb test

    d.显示需要编译调试的源程序:l(list)//list filename

    e.设置断点:b(break)行号

    f.查看设置的断点:info b

    g.运行调试程序:run

    h.跳到下一个断点:c(continue)

    i.单步运行的话使用:n(next)/s(step into)跳到函数体 //区别在与:next执行函数体,而step不执行函数体

    j.调试过程中查看某个变量的变化:print i (每次都要手动设置)//display i(设置一次一直尾随,直到用“undisplay 变量标号” 停止)

    k.退出当前的调试使用finish 跳出函数

    l.清楚断点 clear 行号

    m.Delete 断点信息序号// 删除所有断点或设置的要删除的断点

    n.退出调试 q

    o.b  num  if  i==20 设置断点的触发条件

    p.condition num i==50 改变断点的触发条件

    (3)常用命令汇总

     1 (1) gdb 可执行文件 : 表示对某个文件进行调试
     2 (2) b 函数名/行数  :  在某个函数名或行数前设置断点
     3 (3) run/r          : 表示开始运行,如果是正在调试的程序的话,表示再次进行调试
     4 (4) n/next         : 表示执行下一行语句
     5 (5) l/list         : 列出源码默认10行(当前位置的上下共10行)
     6     list 行号      : 列出行号上下共10行的源码
     7     list 函数名    : 列出函数名上下共10行的源码
     8 (6) s/step         : 表示单步执行,进入函数
     9 (7) p /x 变量名    : 按16进制输出变量的值
    10       /d           : 按10进制
    11       /o           : 按八进制
    12 (8) set var 变量名=值 : 设置变量的值
    13 (9) bt(backtrace)  : 查看各级函数调用及参数,简写bt
    14 (10)q/quit         : 退出
    15 (11)finish         : 连续运行到当前函数返回为止,然后停下来等待命令
    16 (12)continue/c     : 跳转到下个断点,或者跳转到观察点
    17 (13)ptype 变量名   : 可以查看变量的类型,简写为pt
    18 (14)watch
    19     作用:一般用来观察某个变量/内存地址的状态(也可以是表达式),
    20           如可以监控该变量/内存值是否被程序读/写情况。
    21     有三种方法:
    22     1.watch expr(指定变量/内存地址/表达式)
    23     一旦expr的值有变化时,将停住程序。
    24     2.rwatch expr
    25     当expr被读时,停住程序。
    26     3.awatch expr
    27     当expr被读或被写时,停住程序。
    28     watch使用步骤:
    29         1. 使用break在要观察的变量所在处设置断点;
    30         2. 使用run执行,直到断点;
    31         3. 使用watch设置观察点;
    32         4. 使用continue观察设置的观察点是否有变化。
    33 (15)start            : 开始执行程序,停在main函数第一行语句前面等待命令
    34 (16)info watchpoints : 列出所有观察点
    35     info breakpoints : 查看当前设置的所有断点
    36 (17)d/delete [breakpoinsts num] [rang...]         
    37     d/delete         : 删除所有断点
    38     d/delete num     : 删除breakpoints为num的断点
    39     d/delete num1-num2 : 删除breakpoints为num1-num2的断点
    40 (18)enable num       : 启用num号断点
    41 (19)disable num      : 关闭num号断点
    42 (20)u/until          : 结束当前循环

    5.IDE工具

      可以使用IDE工具codeblocks

    参考文档:

    gcc的使用简介与命令行参数说明

    GCC编译器编译链接

    gcc编译与gdb调试简要步骤

    Linux下编辑、编译、调试命令总结——gcc和gdb描述

  • 相关阅读:
    javaApi Swagger配置
    java跨域配置
    applation.properties与applation.yml关于sql数据库连接配置的区别
    SpringBoot学习记录一
    Centos命令行报bash:.....:command not found的解决办法
    Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
    C# 两种封装的区别
    此 ObjectContext 实例已释放,不可再用于需要连接的操作。
    .net MVC ajax传递数组
    正则表达式移除首部尾部多余字符
  • 原文地址:https://www.cnblogs.com/badboy200800/p/9956088.html
Copyright © 2011-2022 走看看