Linux---函数库和Makefile

news2024/11/26 17:30:46

Linux---函数库和Makefile

  • 函数库
    • 动态库
    • 静态库
  • Linux项目自动化构建工具-make/Makefile
    • 背景
    • 实例代码
    • 原理
    • 项目清理

函数库

方法实现就是在库当中,库其实就是把源文件经过一定的翻译,然后打包,只给你提供一个文件计科,不用给你提供太多的源文件,也可以达到隐藏源文件的目的。

头文件提供声明,库文件提供方法的实现 + 你的代码 = 你的软件

函数库一般分为静态库和 动态库两种

Linxu:.so是动态库 .a静态库

windows:.dll动态库 .lib静态库

库有自己的命名规则:libname.so.XXX

只需要知道name就可以知道库的名字

gcc 默认生成的二进制程序,是动态链接的,这点可通过file命令验证

动态库

动态库也称共享库,是一种可供多个程序共享使用的可重定位目标文件。它包含一些预编译的可执行代码和可供程序调用的函数和变量。动态库通常在程序运行时被动态地加载和链接,而不是在编译时静态链接。这使得动态库可以减小程序的内存占用,并允许多个程序共享相同的库,从而提高程序的可重用性和可维护性。

动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法进行正常运行。

静态库

静态库是指编译链接时,把库文件的代码全部加入搭配可执行文件中,因此生成的文件比较大,但在运行时就不需要库文件了,其后缀名一般为.a

使用-static选项可以优先使用静态库
在这里插入图片描述

以静态链接的方式,程序的大小会变大,

如果我们没有动态库,只有静态库,而且gcc能找到,在不使用-static的情况下,gcc默认优先动态链接,-static的本质:改变优先级,只适配一次

不一定是纯的全部动态链接或者静态链接,混合的。

Linux项目自动化构建工具-make/Makefile

背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
  • 译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

实例代码

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world" << endl;
    cout << "Hello world" << endl;
    cout << "Hello world" << endl;
    cout << "Hello world" << endl;
    return 0;
}

makefile文件

Make:make.cpp
	g++ -o Make make.cpp 
clean:
	rm Make

依赖关系(Dependency)是指一个目标文件所依赖的源文件或其他目标文件。当源文件或其他目标文件发生变化时,Make 工具会根据这些依赖关系来判断是否需要重新构建目标文件。

依赖方法(Dependency recipe)是指在 Makefile 中定义目标文件的构建规则。它告诉 Make 工具如何根据依赖关系来生成目标文件。依赖方法通常由一条或多条命令组成,用于执行编译、链接等操作,以最终生成目标文件。

  1. 定义依赖关系:

    复制代码target: dependency1 dependency2 ...
    

    这里 target 是要生成的目标文件,dependency1dependency2 等是 target 所依赖的文件或目标。

  2. 定义依赖方法:

    复制代码target: dependency1 dependency2 ...
        command1
        command2
        ...
    

    在上述示例中,command1command2 等是根据依赖关系执行的命令。当依赖关系中的任何一个文件发生变化时,Make 工具将自动执行对应的依赖方法,即执行与该目标相关的命令,以完成目标文件的构建。

通过定义正确的依赖关系和依赖方法,Make 工具能够自动判断源文件和目标文件之间的依赖关系,并根据需要执行对应的命令来生成最终的目标文件。

原理

当我们在终端中输入 make 命令时,Make 工具会执行以下操作:

  1. 读取 Makefile:Make 工具会查找当前目录下的名为 Makefile
  2. 解析 Makefile:Make 工具会解析 Makefile 文件,并分析其中的规则、依赖关系和命令。它会根据这些信息来确定何时需要重新构建目标文件。
  3. 检查依赖关系:Make 工具会检查每个目标文件所依赖的源文件或其他目标文件是否发生变化。它会比较文件的时间戳来确定是否需要重新构建目标文件。
  4. 执行命令:如果某个目标文件的依赖项发生了变化,或者该目标文件不存在,Make 工具将会执行与之相关的命令。这些命令通常包括编译、链接等操作,以生成新的目标文件。
  5. 生成目标文件:在执行命令后,Make 工具将生成最终的目标文件,并保存在指定的输出路径中。

项目清理

工程是需要被清理的

在 Makefile 中定义一个名为 “clean” 的目标,并添加相应的命令来完成项目清理。

当我们在终端中执行 make clean 命令时,Make 工具将会查找 Makefile 中的 “clean” 目标,并执行对应的命令。这样就可以清理项目中指定的文件或目录。

clean:
	rm Make

在这里插入图片描述

清理规则通常不需要明确的依赖关系,而是作为一个独立的操作来执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring -- Bean的生命周期

BeanDefinition Spring容器在进行实例化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean BeanDefinition 中几个重要方法如下 beanClassName&#…

阿里云——云服务器基础运维与管理

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 学习目标&#xff1a; 一.3个理由拥抱云服务器 1.什么是云服务器 2.使用…

人物百科词条创建教程分享,人物创建百科有什么要求

人物百科词条的创建是一个相对复杂的过程&#xff0c;需要遵循一定的规范和要求。以下是一个人物百科词条创建教程的分享&#xff0c;包括创建要求、步骤和注意事项&#xff0c;接下来伯乐网络传媒就来给大家好好讲一讲。 一、人物百科词条创建要求 1. 真实性&#xff1a;创建…

ELK-日志服务【filebeat-安装使用】

目录 【1】安装Filebeat 【2】配置-测试 【3】配置使用Filebeat 【4】filebeat-收集系统文件日志 【5】配置filebeat&#xff0c;将/var/log/all.log日志采集到es集群中 【6】定制索引名称 【7】收集多个web节点的日志&#xff0c;输出到相同的索引中 【8】filebeat-收…

【并查集+组合计数】ABC226 E

E - Just one (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先有个条件&#xff1a;每个点只有一个出边 如果没有直接看出结论&#xff0c;可以画几个链和树等特殊的图&#xff0c;可以发现&#xff0c;树是不满足条件的&#xff0c;环是满足条件的&#xff0c;因此可…

管理类联考——数学——记忆篇——数字编码

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程 javaweb开发环境的配置也是比较繁琐的一件事情&#xff0c;虽然理论上使用记事本&#xff0c;完全可以写出一个Javaweb工程&#xff0c; 但是在团队大型开发的Javaweb过程中&#xff0c;你必须配置好Eclipse、SV…

【算法集训之线性表篇】Day 08

文章目录 题目基本设计思想思路一思路二 代码实现效果 题目 已知一个整数数列A{a0,a1,a2,…,an-1}&#xff0c;其中0<ai<n(0<i<n)。若存在ap1ap2ap3…apmx且m>n/2(0<pk<n,1<k<m)&#xff0c;则成x为A的主元素。例如A{0,5,5,3,5,7,5,5}&#xff0c;…

Python模拟MQTT v3.1.1服务器

示例代码 import logging import asyncio from hbmqtt.broker import Broker# 设置日志级别为DEBUG logging.basicConfig(levellogging.DEBUG)# 创建MQTT服务器 broker Broker()# 启动MQTT服务器 async def start_broker():await broker.start()# 停止MQTT服务器 async def s…

好用到哭!后悔没有早点看到这个微信多账号管理工具!

作为一款及时通讯软件&#xff0c;微信是许多企业进行客户运营的选择工具。企业的员工利用微信与客户进行沟通&#xff0c;并且许多客单也都在微信上如数完成。然而&#xff0c;微信本身并不具备运营需要的很多功能&#xff0c;所以需要借助第三方工具来实现。 安全吗&#xf…

day20 数组指针

int main(void) {char *name[5] {"hello","china","beijing","project","Competer"};int i;for(i0;i<5;i){printf("%s\n",name[i]);//结果打印五个字符串}return 0; }数组指针&#xff0c;存了5个指针&#x…

串行FLASH文件系统FatFs-实际应用

目录 串行FLASH文件系统FatFs-实际应用 功能展示 程序代码 程序过程分析 串行FLASH文件系统FatFs-实际应用 功能展示 实验主要使用我们移植好的FatFs的FLASH文件系统实现三个功能&#xff1a;设备信息获取、文件定位写入功能测试和文件信息获取测试功能。 最终串口输出结…

4.带你入门matlab排序最值标准差标差(matlab程序)

%% 学习目标&#xff1a;排序&#xff0c;最值&#xff0c;标准差&#xff0c;方差 代码及结果 %% 排序 clear all; X[1 3 4;8 3 5;2 7 4] y1sort(X) %按列由小到大排序 y2sort(X,2) %按行由小到大排序 y3sort(X,1,descend) %按列由大…

自定义程序包不存在的解决方法

方案一&#xff1a; 在pom文件中加入以下代码 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.4.2</version><configuration><skipTests>true</sk…

数据驱动的决策优化,半导体CMS系统在企业管理中的应用

在当今信息时代&#xff0c;数据的重要性在企业管理中愈发凸显。半导体制造业作为一个高度自动化和数据密集的行业&#xff0c;利用数据进行决策优化对于企业的成功至关重要。在这方面&#xff0c;PreMaint CMS系统扮演着关键的角色&#xff0c;为企业管理提供了数据驱动的决策…

Git Commit的规范及高级使用方法

git commit是日常工作中使用率极高的一个命令&#xff0c;但是根据我从业5年的经验来看&#xff0c;大多数人在用git commit命令时都很粗糙&#xff0c;比如git commit -m 后跟的message是五花八门&#xff0c;有用中文的&#xff0c;有用英文的&#xff0c;甚至还有直接跟111的…

小程序搭建教程

小程序搭建流程 随着移动互联网的发展&#xff0c;小程序成为了营销和服务的重要渠道之一。在本文中&#xff0c;我们将介绍如何搭建一个小程序的详细流程&#xff0c;包括公众号申请、支付微信认证费、复用资质申请小程序、开通微信支付、绑定第三方开发平台、添加商品服务内…

基于SpringBoot的企业人力资源管理系统设计与实现

1.引言 随着经济改革开放的发展&#xff0c;企业之间的竞争也越来越激烈&#xff0c;在这样的大环境下&#xff0c;企业要想立于不败之地&#xff0c;不仅要有好的商品&#xff0c;更要有一支强有力的团队&#xff0c;其本质就是人才。企业对人才的需求不断的增加&#xff0c;…

视频剪辑素材网站,免费可商用,赶紧马住~

推荐几个高质量视频素材网站&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#xff…

485远传水表抄表系统

485远传水表抄表系统是一种基于RS-485通信协议的远程抄表系统&#xff0c;它利用现代通信技术&#xff0c;实现了对水表数据的远程采集、传输和处理&#xff0c;是智慧城市建设的重要组成部分。本文将从以下几个方面对485远传水表抄表系统进行全面介绍&#xff1a; 一、系统组成…