Linux 3:makefile文件,gdb,库文件(动态和静态)

1. makefile文件和make命令

1.1 安装

和以往的gcc,g++同一个操作

1.2 makefile文件和make命令的介绍

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

由于一个大型项目工程中有大量的源文件,个人编译起来容易漏一个,这个时候就可以使用makefile文件,makefile文件利用定义了一系列的规则来帮助我们去管理这些源文件,指定了哪些文件先进行编译,哪些源文件后进行编译,哪些文件被修改了,需要重新编译。
make命令:解释makefile文件,执行对应的操作
示例如下:
假设这里有三个源文件:main.c max.c add.c
在这里插入图片描述
接下来:对其进行编译:
在这里插入图片描述
假设,这里不是三个源文件,而是非常多,自己编译容易漏,并且如果我们修改其中的一部分源文件,那么我们应该只对其中修改过的源文件进行重新编译最合理的,这里makefile文件可以完美达到我们的需求。

makefile具体代码实现

在这里插入图片描述
通过make命令运行一下makefile文件:

在这里插入图片描述
如果需要保证编译后的整洁,则可以在makefile的最后加上clean:
在这里插入图片描述

2. gdb调试

2.1 Debug版本和Release版本

Debug版本,是可调式版本,具有调试信息。
Debug版本如何生成:gcc默认生成的是release版本,如果需要手动添加参数-g
命令格式如下:
第一种:gcc -c main.c -g(生成具有调试信息的中间文件main.o),再通过命令gcc -o main main.o
第二种:gcc -o main main.c -g

2.2 gdb应用

测试文件:main.c
在这里插入图片描述
通过gcc -o main main.c -g 一步生成具有可调式信息的可执行文件:
在这里插入图片描述
运行起来,发现输入“end”的时候,正常退出不了:
在这里插入图片描述
这时,我们用gdb调试一下可执行文件main,找一下问题所在:
在这里插入图片描述
命令:
l //显示当前文件的源代码(默认一次显示10行)

1. 库文件的生成和使用

1.1 什么是库文件?

库是一组预先编译好的方法的集合
Linux上的库的位置:/lib 和 /usr/lib
在这里插入图片描述
但是在红帽子上,/lib和/usr/lib分开
库有两种形态:静态库和动态库(共享库)
linux:静态库(libxxx.a),动态库(libxxx.so)
windows:静态库(.lib),动态库(.dll)

1.2 静态库如何生成和使用

1.2.1 静态库的生成

下面会有准备生成静态库的三个文件:max.c add.c和fun.h
在这里插入图片描述
第一步:先讲源文件编译成".o"文件
在这里插入图片描述

第二步:使用ar命令将第一步产生的“.o”文件,生成对应的静态库

  • c 创建库
  • r 将对应方法添加到库中
  • v 显示执行过程
  • t 显示库中包含的方法
    在这里插入图片描述

1.2.2 静态库的使用

现在有测试文件main.c的代码内容:
在这里插入图片描述

1.3 动态库如何生成和使用

1.3.1 动态库的生成

下面会有准备生成静态库的三个文件:max.c add.c和fun.h
在这里插入图片描述
第一步:先讲源文件编译成".o"文件
在这里插入图片描述
第二步:使用gcc命令将第一步一步产生的“.o”文件,生成对应的动态库

gcc -shared -fPIC -o libxxx.so max.o add.o

  • -shared 生成动态库
  • -fPIC 说明生成的动态库中的方法使用相对地址
    在这里插入图片描述

1.3.2 动态库的使用

现在有测试文件main.c的代码内容:
在这里插入图片描述
运行起来,发现可执行文件main,能生成,但是执行起来会报错,会说找不到相应的共享库,因为可执行文件main执行起来发现需要共享库funs,它直接回去标准路径下/usr/lib去找,这时肯定找不到,所以会报错,解决方案就是将生成的动态库libfuns.so拷贝一份放到/usr/lib下,就不会报错了:
在这里插入图片描述
假设当前路径下,有同名的静态库和动态库,那么可执行文件链接的是哪一个库?
在这里插入图片描述

1.4 静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中**
共享库不包含,只做标记,在运行程序时,才动态加载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值