Makefile:make install的实现(十一)

1、make install的概念
  • 在Linux环境下有些时候软件或者服务会通过源码安装,执行一些make、make install、make clean的指令。例如:redis

    • make:编译所有的文件、生成一些动态库、静态库、可执行程序等等
    • make install:通常会创建一个文件目录,然后写入一些服务的启动停止脚本
    • make clean:清除该项目所有的编译和一些包,重置
  • 这其实就是源码包里面有Makefile,通过makefile编译然后执行安装

  • 流程:

    • 将源文件编译成二进制可执行文件(包括各种库文件)
    • 创建目录,将可执行文件拷贝到指定的目录(安装目录)
    • 加全局可执行的路径
    • 加全局的启停脚本
    • 重置编译环境,删除无关文件
2、实现

假设当前项目比较简单,只有几个文件

  • 08_main.cpp:主程序文件
  • Makefile文件
  • 但是最后需要再当前目录下生成一个tmp文件,里面需要有:
    • 08_main:二进制可执行文件
    • 08_main.log:程序运行时的一些输出日志写入到里面
    • 08_main_start:全局启动脚本(需要软连接或拷贝到/usrl/local/bin下)
    • 08_main_stop:全局停止脚本(需要软连接或拷贝到/usrl/local/bin下)
  • 最终目标图如下

在这里插入图片描述

2.1、main.cpp
#include <iostream>
#include <unistd.h>int main()
{for(int i = 1; i ;i++){std::cout << "08_main_running-" << i << std::endl;sleep(1);}return 0;
}
2.2、Makefile
  • 变量:

    • src:先获取到当前路径下的所有.cpp文件

    • target:可执行目标文件名

      • install_path:需要创建的文件夹,文件夹下需要有
        • 08_main、08_main.log、08_main_start、08_main_stop四个文件
    • start_sh:启动脚本名称

    • stop_sh:停止脚本名称

    • log:日志文件名

  • 命令:

    • $(target):$(src):生成可执行目标,这里的可执行目标比较简单,这也是第一个目标,也就是make默认执行的入口

      • g++ $< -o $@:编译生成可执行目标08_main
    • install:$(target):这就是make install所执行的目标,这里调用了一些shell编程脚本的东西

      • if [ -d $(install_path) ];\:首先判断当前文件是否存在:如果存在输出一些提示then echo $(install_path) exist; \

      • else:否则就开始进行文件的一些操作和连接

        • ·mkdir $(install_path);\:当前目录创建下tmp文件夹

        • mv $(target) $(install_path);\:将生成的可执行文件移入到tmp文件夹下

        • touch $(install_path)$(log);\:在tmp文件夹下创建一个运行产生的日志文件

        • sudo ln -s $(absolute_path)$(install_path)$(target) $(ln_path);\:软连接这个可执行程序到/usr/local/bin下,使得全局都可以执行

        • echo "$(absolute_path)$(install_path)$(target)>$(absolute_path)$(install_path)$(log) & echo $(target) running">$(install_path)$(start_sh);\:这个脚本的意思是将可执行文件的执行指令写入到08_main_start启动脚本中,并且把输出结果重定向到08_main.log日志文件中,并且在后台运行(不占用bash),在输出一些提示。

          /home/splay/Makefile/08-make-install/./tmp/08_main>/home/splay/Makefile/08-make-install/./tmp/08_main.log & echo 08_main running
          
        • echo "killall $(absolute_path)$(install_path)$(target)">$(install_path)$(stop_sh);\:将停止脚本写入到08_main_stop脚本中

          killall /home/splay/Makefile/08-make-install/./tmp/08_main
          
        • sudo chmod a+rwx $(install_path)$(start_sh);\:给08_main_start脚本加入读写执行权限,下同

        • sudo ln -s $(absolute_path)$(install_path)$(start_sh) $(ln_path);\:将08_main_start启动脚本软连接到/usr/local/bin下,使得可以全局执行,下同。软连接需要注意使用绝对路径,使用相对路径会导致错误,正确的软连接是淡绿色,错误的软连接是红色

    • make clean:这是make clean的执行目标,主要就是清除上面生成的这些文件和软链接的环境变量

    • .PHONY: clean install:伪目标

src=$(wildcard ./*.cpp)
target:=08_maininstall_path:=./tmp/
ln_path:=/usr/local/bin/
start_sh:=$(target)_start
stop_sh:=$(target)_stop
log:=$(target).logabsolute_path:=$(shell pwd)/$(target):$(src)g++ $< -o $@install:$(target)if [ -d $(install_path) ];\then echo $(install_path) exist; \else \mkdir $(install_path);\mv $(target) $(install_path);\touch $(install_path)$(log);\sudo ln -s $(absolute_path)$(install_path)$(target) $(ln_path);\echo "$(absolute_path)$(install_path)$(target)>$(absolute_path)$(install_path)$(log) & echo $(target) running">$(install_path)$(start_sh);\echo "killall $(absolute_path)$(install_path)$(target)">$(install_path)$(stop_sh);\sudo chmod a+rwx $(install_path)$(start_sh);\sudo chmod a+rwx $(install_path)$(stop_sh);\sudo ln -s $(absolute_path)$(install_path)$(start_sh) $(ln_path);\sudo ln -s $(absolute_path)$(install_path)$(stop_sh) $(ln_path);\fi;clean:$(RM) $(target)$(RM) -rf $(install_path)sudo $(RM) -r $(ln_path)$(target)sudo $(RM) -r $(ln_path)$(start_sh)sudo $(RM) -r $(ln_path)$(stop_sh).PHONY: clean install

在这里插入图片描述

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

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

相关文章

BTN7960B 电机驱动芯片 TO-263-7 智能车驱动器

BTN7960B是一种半桥式驱动器&#xff0c;适用于直流刷式电机。它具有高侧和低侧MOSFET驱动器&#xff0c;可以操控电机的正转和反转。此外&#xff0c;它还具有过流保护、欠压确定和热关断等功能&#xff0c;以保证体系在各种工作条件下的安全和安稳运转。 制造商: Infineon…

绿联 安装zfile,创建属于自己的网盘,支持直链分享

绿联 安装zfile&#xff0c;创建属于自己的网盘&#xff0c;支持直链分享 1、镜像 zhaojun1998/zfile:latest ZFile ZFile 是一个适用于个人的在线网盘(列目录)程序&#xff0c;可以将你各个存储类型的存储源&#xff0c;统一到一个网页中查看、预览、维护&#xff0c;再也不用…

C++ 标准库类型stackqueue

C/C总述&#xff1a;Study C/C-CSDN博客 栈与队列详解&#xff08;数据结构&#xff09;&#xff1a;栈与队列_禊月初三-CSDN博客 stack&#xff08;栈&#xff09; stack的常用函数 函数说明功能说明stack()构造空栈push(T& val)将元素val压入栈中size()返回栈中元素个…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级&#xff1a;核心简洁&#xff0c;只提供了基本的功能&#xff0c;其他高级功能可以通过插件或扩展来添加。 b. 灵活性&#xff1a;允许开发者选择适合自己项目的组件和工具&#xff0c;没有强制的项目结构和设计模式。 c. 易于扩展&#xff1a;提…

HTML:框架

案例&#xff1a; <frameset cols"5%,*" ><frame src"left_frame.html"><frame src"right_frame.html"> </frameset> 一、<frameset>标签 <frameset>标签&#xff1a;称为框架标记&#xff0c;将一个HTML…

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

element UI中设置图片的高度并支持PC和手机自适应

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…

JVM专题——类文件结构

本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-file-structure.html &#x1f680; 基础&#xff08;上&#xff09; → &#x1f680; 基础&#xff08;中&#xff09; → &#x1f680;基础&#xff08;下&am…

《Java面试自救指南》(专题二)计算机网络

文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型&#xff08;TCP/IP协议模型&#xff09;各种io模型的知识http协议和tcp协议的区别https和http的区别…

京准、ntp校时服务器(GPS北斗卫星校时器)技术方案

京准、ntp校时服务器&#xff08;GPS北斗卫星校时器&#xff09;技术方案 京准、ntp校时服务器&#xff08;GPS北斗卫星校时器&#xff09;技术方案 四分天下目前&#xff0c;全球的 GPS卫星同步系统处于“四分天下”状态&#xff0c;以美俄两国的系统处于领导地位&#xff0c…

【Unity每日一记】如何让Sprite精灵图集的背景图层变成透明,方便切割

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【电路笔记】-逻辑或门

逻辑或门 文章目录 逻辑或门1、概述2、2 输入晶体管或门3、数字逻辑或门类型逻辑或门是一种数字逻辑电路,仅当其一个或多个输入为高电平时,其输出才会变为高电平至逻辑电平 1。 1、概述 “逻辑或门”的输出 Q 仅当其所有输入都处于逻辑电平“0”时才再次返回“低”。 换句话…

《CSS入门到精通》结语

1. CSS学习资源推荐&#xff1a; 进一步探索CSS及前端技术的世界&#xff0c;可以从以下几个高质量的学习资源和社区入手&#xff1a; 在线课程&#xff1a; W3Schools&#xff1a;提供了详尽的CSS教程和实践示例。 Codecademy、FreeCodeCamp&#xff1a;包含互动性强的CSS课程…

Pygame基础10-物理模拟

PyMunk PyMunk是一个模拟物理的库。 注意&#xff0c;PyMunk只是进行物理模拟&#xff0c;不包含可视化的功能。如果需要可视化&#xff0c;可使用pygame等库。 可用pip安装pymunk pip install pymunk pymunk中的概念&#xff1a; space&#xff1a; 物理空间。 包含gravity 模…

爬虫 知识点2以及SSL1129错误该怎么解决

article_url url_tag[href]article_response requests.get(article_url, headersheaders)article_soup BeautifulSoup(article_response.content, "html.parser")print(index)&#xff08;1&#xff09;article_url url_tag[‘href’] 这行代码从一个名为url_tag…

AJAX —— 学习(一)

目录 一、原生 AJAX &#xff08;一&#xff09;AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 &#xff08;二&#xff09;XML 介绍 1.理解 2.作用 &#xff08;三&#xff09;AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 &#xff08;一&#xff09;HTTP 介…

C语言中的结构体:揭秘数据的魔法盒

前言 在C语言的广阔天地中&#xff0c;结构体无疑是一颗璀璨的明珠。它就像是一个魔法盒&#xff0c;能够容纳各种不同类型的数据&#xff0c;并按我们的意愿进行组合和排列。那么&#xff0c;这个魔法盒究竟有何神奇之处呢&#xff1f;让我们一探究竟。 一、结构体的诞生&…

Java学习14(异常)

异常 概述 程序运行过程出错的情况就是异常。Java提供了异常处理机制&#xff0c;出现不正常情况的时候&#xff0c;就会把异常信息打印到控制台&#xff0c;供程序员参考修改。 这是Java打印的异常信息&#xff0c;这个信息是JVM打印的。 异常的作用&#xff1a; 增强程序的健…

FOC算法中为啥用PWM触发ADC中断

在FOC&#xff08;Field Oriented Control&#xff0c;场向量控制&#xff09;算法中&#xff0c;为什么要使用PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09;触发ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09;中断…

可以写网易云的了!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中…