链接及调试

  • 一、多文件链接的方法
    • 1.多文件链接的一般方法
    • 2.多文件链接的makefile方法
  • 二、调试
    • 1.安装gdb的命令:
    • 2.单进程、单线程基础调试命令
    • 3.基础调试

一、多文件链接的方法

1.多文件链接的一般方法

  1. 给出所要调用的函数声明及实现方法
cat max.h
int max(int x,int y);    //max函数的声明cat max.c
#include"max.h"
int max(int x,int y)
{return x>y?x:y;
}                         //max函数的实现方法cat add.h
int add(int x,int y);    //add函数的声明cat add.c
#include"add.h"
int add(int x,int y)
{return x+y;
}                        //add函数的实现方法
  1. 将写好的.c文件编译成.o文件
gcc -c max.c
gcc -c add.c   //用这两个命令将两个.c文件编译成.o文件

此时的两个程序不能单独链接成可执行文件,因为可执行文件需要主函数。

  1. 写出需要调用上面两函数的程序
cat main.c
#include<stdio.h>
#include"add.h"
#include"max.h"
int main()
{int a=2,b=3;printf("add=%d\n",add(a,b));printf("max=%d\n",max(a,b));return 0;
}                             //主程序
gcc -c main.c                //将main.c文件编译成main.o文件;
  1. 将所有就绪的.o文件连接成可执行的main程序
gcc -o main.o max.o add.o   //此命令将所有就绪的.o文件连接成可执行的main程序
  1. 执行main程序
./main     //此命令执行main程序

2.多文件链接的makefile方法

Makefile是用来管理工程,实现自动化编译的工具,和VS中的程序的编译执行是对应的。

makefile文件的写法:
注意: gcc 前面必须是 table 建缩进

make 命令根据 makefile 文件的规则生成可执行程序

二、调试

程序运行时有两个版本:

  • Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人
    员,最常用的就是 debug 版本的可执行文件。
  • Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版
    本。

我们调试的是一个可以执行的程序。调试的命令为gdb。

1.安装gdb的命令:

sudo apt install gdb

2.单进程、单线程基础调试命令

 - l               //显示 main 函数所在的文件的源代码- list 文件名:num //显示 filename 文件 num 行上下的源代码- b 行号          //给指定行添加断点- b 函数名        //给指点函数的第一有效行添加一个断点- info break      //显示断点信息- delete 断点号   //删除指定断点- disable 断点号  //将断点设定为无效的,不加断点号,将所有断点设置为无效- enable 断点号   //将断点设定为有效的,不加断点号,将所有断点设置为有效- r(run)        //运行程序- n(next)      //单步执行- c (continue) //继续执行,直接执行到下一个断点处- s              //进入将要被调用的函数中执行- finish         //跳出函数- q              //退出调试- p val          //打印变量 val 的值- p &val         //打印变量 val 的地址- p a+b          //打印表达式的值- p arr(数组名)//打印数组所有元素的值- p *parr@len    //用指向数组的指针打印数组所有元素的值- display        //自动显示,参数和 p 命令一样- info display   //显示自动显示信息- undisplay + 编号 //删除指定的自动显示- ptype val      //显示变量类型- bt             //显示函数调用栈

3.基础调试

在Linux系统下,我们编译程序时,默认是Release 版本,切换到Debug 版本是需要加入参数的。

以下给出常用命令的示例:

  • gdb +文件名,开始调试程序

  • L是显示命令,一般默认显示10行,程序太长时,接着使用L命令会接着上一次的显示。

  • b加断点:b+数字表示在第几行加断点。info break是显示断点信息。

  • r是执行程序。如图程序执行时停在11行断点处。

  • c是从上一个断点处开始执行,执行到下一个断点处停下。

  • n是单步执行程序,p是打印。

  • finish结束调试

Linux下多文件链接执行及调试技术相关推荐

  1. 从四个问题透析Linux下C++编译链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  2. Linux环境无文件渗透执行ELF:memfd_create、ptrace

    <GDB调试之ptrace实现原理> <C语言程序调用栈:backtrace+backtrace_symbols+backtrace_symbols_fd> <strac ...

  3. Linux下的lds链接脚本详解

    一. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分 ...

  4. Linux下各文件夹的结构说明及用途介绍(转载)

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  5. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  6. linux 下删除文件的 操纵

    linux   下删除 文件的 方法::: 1-  remove remove(删除文件) 相关函数 link,rename,unlink 表头文件 #include<stdio.h> 定 ...

  7. Linux下查看文件占用空间大小的du 和df 命令

    Linux下查看文件占磁盘大小一般使用du或df命令 df命令:用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. du命令 ...

  8. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决

    Linux下编译.链接.加载运行C++ OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C++之后(还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C++) ...

  9. Linux下的文件类型、文件后缀名 知识点解析

    文章目录 1.Linux文件的扩展名: 2.Linux 文件类型: 参考博客: https://blog.csdn.net/AQRSXIAO/article/details/82774729 人需要不 ...

最新文章

  1. javascript python 通信_Python通过websocket与js客户端通信示例分析
  2. 想爱容易,相处难:当ASP.NET MVC爱上IoC
  3. mysql 加索引不起作用_mysql加索引及索引失效的情况
  4. 【Qt】窗口组件和窗口类型
  5. 浅析 Sunday 算法
  6. cheatengine找不到数值_“不会找问题”,只配在底层,最高效的思维方式导图,人生开挂!...
  7. html响应式五栏布局,HTML – 响应式2列CSS布局,包括固定宽度的侧边栏?
  8. 【比赛】CCL“中国法研杯”相似案例匹配评测竞赛 - TOP队伍攻略分享
  9. iOS 中的正则匹配(工具类方法)
  10. springmvc自定义类型转换
  11. 安装完office没有图标_很多人不会设置路由器?只因没有弄懂安装顺序,看完你就会了...
  12. 工业软件下载大全202108
  13. IOS pushVIewController失败
  14. 使用信锐无线控制器对接营运商portal服务器的原理分析与排错
  15. IE11不兼容css3渐变属性
  16. 机器学习训练模型的大体流程
  17. 如何修改MySQL监听IP地址
  18. 一键检测Linux VPS/服务器配置、IO、国内节点下载测速
  19. 微信公众号数据2019_2019年2月全国Top100购物中心微信公众号榜单
  20. EXCEL里如何知道某种颜色的ColorIndex的值

热门文章

  1. jQuery取值的一些奇奇怪怪的操作
  2. 学习笔记TF064:TensorFlow Kubernetes
  3. Linux下sh/bash/source/.命令的区别(转)
  4. js中常用的对象—String的属性和方法
  5. 实施项目--为什么开发人员一直在抱怨需求变动
  6. 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
  7. 基于Linux(LAMP)平台搭建MYsql数据库(二)
  8. 不能上传图片和编辑内容很慢,望改进
  9. 从刚入职阿里的学弟那里薅来的面试题,速速领取~~~
  10. 程序员别只顾着敲代码了,看看吧