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;组件 文章目录 系列文章目录…

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

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

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

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

Pygame基础10-物理模拟

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

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; 增强程序的健…

可以写网易云的了!

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

设计模式——原型模式05

原型模式核心复制&#xff0c;每次new出来的对象完全不一样&#xff0c;实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝 设计模式&#xff0c;一定要敲代码理解 浅拷贝 克隆出对象&#xff0c;其中两者的引用类型属性是同一个对象。 对象信息 /*** author ggb…

常用的AI绘画自动生成器介绍

AI绘画自动生成器是一种利用人工智能技术生成图像的工具。它可以根据用户输入的文本描述自动生成相应的图像。目前,有几种流行的AI绘画自动生成器,包括: 1. **DALL-E 2** DALL-E 2是由OpenAI开发的AI绘画生成器,它可以根据用户输入的自然语言描述生成高质量的图像。DALL-E 2使…

【Linux】Linux进程学习(基本认知)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言一、冯诺依曼体系二、系统管理三、进程理解3.1 代码与数据3.2 进程控制块 四…

jvm总结学习

四种加载器 1.启动类加载器 2.拓展类加载器 3.应用程序加载器 4.自定义加载器 沙箱机制 就是为了保证安全&#xff0c;增加的一些权限。 native方法区&#xff08;静态变量&#xff0c;常量&#xff0c;类信息&#xff08;构造方法&#xff0c;接口定义&#xff09;&…

突破!AI机器人拥有嗅觉!仿生嗅觉芯片研究登上Nature子刊

我们一直梦想着让AI与人类能够更加相似&#xff0c;赋予它们视觉与听觉。而让机器人拥有嗅觉一直以来面临着巨大的困难。 香港科技大学范志勇教授领导的研究团队凭借最新研发的仿生嗅觉芯片&#xff08;BOC&#xff09;在这一领域取得了重大突破。该研究成果目前已被发表到IF …

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示&#xff1a; Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键&#xff08;[Pr…