zoukankan      html  css  js  c++  java
  • 【视频】Linux高级程序设计01.1开发工具及gcc gdb

    课程笔记

    Linux 下编辑调试工具,gcc,gdb。

    把高级语言编译成二进制可执行代码的工具。

    需要经历四个步骤:

    (1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#include)包含等工作

     gcc -E test.c -o test.i

    (2) 编译:不同平台采用的汇编语言不一样。编译将高级语言编译成汇编语言。

    gcc -S test.c -o test.s

    (3) 汇编:将汇编语言翻译成二进制的目标代码

     gcc -c test.c -o test.o

    (4) 链接:包含各个函数库的入口,得到可执行代码。

    gcc  test.c -o test

    gcc编译器

    使用 gcc 工具能够检查出语法错误,类型不匹配等问题。但不能解决bug。

    Linux的C源代码文件后缀.c

    .C  C++的代码

    .cc  C++的代码

    .h  头文件

    其他选项:

    优化:目标是使代码性能更优,去掉冗余代码。工具自动完成。
    -O0/1/2/3

    产生调试信息,gdb需要
    -g0/1/2/3

    提示警告
    -Wall
    -Werror
    -D 在命令中定义宏,具体使用举例

    指定头文件位置
    -I

    使用c99
    -std=c99

    gdb调试器

    要解决bug,使用gdb调试器。
    (1)在编译是,需要加上调试信息才可以,-g参数加到gcc编译过程。
    l:list列出各行编号;
    b 行号:在相应的行设置断点;
    p 变量名:打印这个变量值;
    r:run 执行代码
    n:next下一行执行;
    c:continue下一个断点;
    exit:退出

    示例代码:

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    	printf("Hello World
    ");
    	return 0;
    }
    
    #include <stdio.h>
    
    #define PI 3.14
    
    int main(int argc, char *argv[])
    {
    	printf("Hello World,%f
    ", PI);
    	return 0;
    }
    

    当把程序改成:

    #include <stdio.h>
    
    #define PI 3.14
    
    int main(int argc, char *argv[])
    {
    	printf("Hello World,%d
    ", PI);
    	return 0;
    }
    

    时,编译未报错:

    gcc test.c -o test

    但加了参数 -Wall 后,一条 warning信息 就出来了!

    gcc test.c -o test -Wall

    [root@localhost 3]# gcc test.c -o test -Wall
    test.c: In function ‘main’:
    test.c:6: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’

    gcc 编译参数】

    $ gcc --help
    用法:gcc [选项] 文件...
    选项:
      -pass-exit-codes         在某一阶段退出时返回最高的错误码
      --help                   显示此帮助说明
      --target-help            显示目标机器特定的命令行选项
      --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]
                               显示特定类型的命令行选项
      (使用‘-v --help’显示子进程的命令行参数)
      --version                显示编译器版本信息
      -dumpspecs               显示所有内建 spec 字符串
      -dumpversion             显示编译器的版本号
      -dumpmachine             显示编译器的目标处理器
      -print-search-dirs       显示编译器的搜索路径
      -print-libgcc-file-name  显示编译器伴随库的名称
      -print-file-name=<库>    显示 <库> 的完整路径
      -print-prog-name=<程序>  显示编译器组件 <程序> 的完整路径
      -print-multi-directory   显示不同版本 libgcc 的根目录
      -print-multi-lib         显示命令行选项和多个版本库搜索路径间的映射
      -print-multi-os-directory 显示操作系统库的相对路径
      -print-sysroot           显示目标库目录
      -print-sysroot-headers-suffix 显示用于寻找头文件的 sysroot 后缀
      -Wa,<选项>               将逗号分隔的 <选项> 传递给汇编器
      -Wp,<选项>               将逗号分隔的 <选项> 传递给预处理器
      -Wl,<选项>               将逗号分隔的 <选项> 传递给链接器
      -Xassembler <参数>       将 <参数> 传递给汇编器
      -Xpreprocessor <参数>    将 <参数> 传递给预处理器
      -Xlinker <参数>          将 <参数> 传递给链接器
      -save-temps              不删除中间文件
      -save-temps=<arg>        不删除中间文件
      -no-canonical-prefixes   生成其他 gcc 组件的相对路径时不生成规范化的
                               前缀
      -pipe                    使用管道代替临时文件
      -time                    为每个子进程计时
      -specs=<文件>            用 <文件> 的内容覆盖内建的 specs 文件
      -std=<标准>              指定输入源文件遵循的标准
      --sysroot=<目录>         将 <目录> 作为头文件和库文件的根目录
      -B <目录>                将 <目录> 添加到编译器的搜索路径中
      -v                       显示编译器调用的程序
      -###                     与 -v 类似,但选项被引号括住,并且不执行命令
      -E                       仅作预处理,不进行编译、汇编和链接
      -S                       编译到汇编语言,不进行汇编和链接
      -c                       编译、汇编到目标代码,不进行链接
      -o <文件>                输出到 <文件>
      -x <语言>                指定其后输入文件的语言
                               允许的语言包括:c c++ assembler none
                               ‘none’意味着恢复默认行为,即根据文件的扩展名猜测
                               源文件的语言
    
    以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
     不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
  • 相关阅读:
    restful
    spark深入:配置文件与日志
    Spark多种运行模式
    Spark 序列化问题
    [转]关于PreparedStatement.addBatch()方法
    scala helloworld
    java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例
    replace与replaceAll的区别
    String,StringBuffer与StringBuilder
    hive 空值、NULL判断
  • 原文地址:https://www.cnblogs.com/52php/p/5675842.html
Copyright © 2011-2022 走看看