Linux环境基础开发工具----2

本文详细介绍了GCC/G++的编译流程,包括预处理、编译、汇编和链接四个阶段,以及各种编译选项如-O0至-O3的优化级别、-g生成调试信息等。同时,讲解了如何使用gdb进行程序调试,包括设置断点、查看汇编代码、跟踪变量等功能。此外,还介绍了make/makefile的基本用法和git的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gcc/g++(默认动态链接)

  1. 预处理(-E):展开头文件,宏替换,删除注释,条件编译;
  2. 编译(-S):编译器对经过预处理后的程序进行编译,检查语法,生成汇编代码;
  3. 汇编(-c):转换为二进制代码,并生成目标文件;
  4. 链接:链接器对目标文件和用到的函数库进行链接,合成可执行程序,寻找对应声名生成可执行文件。
  5. 指令选项:gcc [选项] 编译文件 [选项] [目标文件]
    -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面;
    -S 编译到汇编语言不进行汇编和链接;
    -c 编译到目标代码;
    -o 文件输出到文件;
    -static 生成的文件采用静态链接,比动态链接文件大;
    -g 生成调试信息。GNU 调试器可利用该信息;
    -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库;
    -O0;-O1;-O2;-O3
    编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高;
    -w 不生成任何警告信息;
    -Wall 生成所有警告信息。
    注意: g++编译C代码,因为C++的编译环境基本涵盖C,而使用gcc编译C++代码,很容易报错。
    在这里插入图片描述

gdb

Linux gcc/g++出来的二进制程序,默认是release模式

  1. 事前:
    disassemble:在gdb中查看汇编代码
    ni 汇编中执行下一句
    list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行
    list/l 函数名:列出某个函数的源代码
    r/run:运行程序
    n/next:逐过程
    s/step:逐语句
    break/b 行号:在某一行设置断点
    break 函数名:在某个函数开头设置断点
    info break :查看断点信息
    finish:执行到当前函数返回,然后挺下来等待命令
    print/p:打印表达式的值,通过表达式可以修改变量的值或者调用函数
    p 变量:打印变量值
    set var:修改变量的值
    continue/c:从当前位置开始连续而非单步执行程序
    run/r:从开始连续而非单步执行程序
    delete breakpoints:删除所有断点
    delete breakpoints n:删除序号为n的断点
    disable breakpoints:禁用断点
    enable breakpoints:启用断点
    info/i breakpoints:参看当前设置了哪些断点
    display 变量名:跟踪查看一个变量,每次停下来都显示它的值
    undisplay:取消对先前设置的那些变量的跟踪
    until X行号:跳至X行
    breaktrace(或bt):查看各级函数调用及参数
    info/i locals:查看当前栈帧局部变量的值
    ctrl + d/quit:退出gdb
  2. 事中:
    将gdb附加到进程上:gdb -p [pid] pid == ps aux |grep [可执行程序]
  3. 事后:
    磁盘约束:umlit -a >> core sile size >> (unlimited)
    程序崩溃产生coredump文件

make/makefile:make -f (文件名称) 解释一个文件

  1. 格式:
    目标对象:依赖对象                        out : a.o b.o c.o
           编译命令                             gcc $^ -o $@
    all : sss ddd                          %.o : %.c      
    sss:qqq                                    gcc -c $< -o $@
    #$^:所有依赖对象;  #<:第一个依赖对象;  $@:目标对象;  
  1. 解释规则:
    ①若依赖对象不存在,则会在当前makefile中查找产生依赖对象的语句执行
    ②类似递归实现,自动补全仅仅是删除文件名后缀,认为剩余是原文件名字,即依赖对象与源码名称
  2. 项目清理: 使用 make : clean
              clean :
                    rm a.o b.o c.o out
  1. 自定义变量与 . PHONY:(伪目标名称)
    BIN = out      
    SRC = $(wildcard *.c)   #*.c:匹配所有.c文件;  $:解引用
    OBJ = $(patsubst %.c,%.o,$(SRC))
    CFLAGS = -g
    $(BIN) : $(SRC)
           gcc $^ -o $@
    %.o : %.c
        gcc $(CFLAGS) -c $< -o $@   #在链接阶段加入指令

git

  1. 安装 git :yum install git
  2. 下载项目到本地:git clone [url]
  3. 将代码放到下载好的目录中:git add [文件名]
  4. 提交改动到本地:git commit .
  5. 同步到远端服务器上:git push

指令:

  1. ldd:查询可执行程序连接的情况
  2. file:查询可执行程序的文件属性
  3. md5sum:判断MD5码是否相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值