IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux 3:makefile文件,gdb,库文件(动态和静态) -> 正文阅读

[系统运维]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 静态库和共享库的区别

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

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:29:31  更:2022-05-07 11:32:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:43:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码