一、引言:常见的安装步骤

经常在安装一些软件时会进行一系列编译步骤,突然冒出一个make来,不知道什么用。

$ ./configure
# 在安装 nginx 配置安装地址时,还会加参数
# ./configure --prefix=/usr/locale/nginx
$ make
$ make install

二、编译

之前的命令其实就是在做编译工作,只不过命令不同,现在举一个简单的例子:

文件 test.c

#include <stdio.h>int main(void)
{fputs("Hello, world!\n", stdout);return 0;
}

编译 -> 运行

$ gcc test.c
$ ./a.out
Hello, world!

三、编译详解

  1. 配置(约定俗成:configure)
预编译工作:- 编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。- 因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。确定编译参数的步骤,就叫做"配置"(configure)。- 这些配置信息保存在一个配置文件 configure 的脚本文件中。通常它是由 autoconf工具 生成的。编译器通过运行这个脚本,获知编译参数。- configure脚本已经尽量考虑到不同系统的差异,并且对各种编译参数给出了默认值。如果用户的系统环境比较特别,或者有一些特定的需求,就需要手动向configure脚本提供编译参数。例如:$ ./configure --prefix=/www --with-mysql (指定安装后的文件保存在www目录,并且编译时加入mysql模块的支持)就是php源码的一种编译配置。
  1. 编译(make)
1. 确定标准库和头文件的位置
2. 确定依赖关系
- 需要确保,只有在被依赖文件编译完成后,才开始编译子文件,且当被依赖文件发生变化时,文件需要被重新编译。- 编译顺序保存在一个叫做makefile的文件中,里面列出哪个文件先编译,哪个文件后编译。而makefile文件由configure脚本运行生成,这就是为什么编译时configure必须首先运行的原因。- 在确定依赖关系的同时也确定了编译时会用到哪些头文件。3. 头文件的预编译(precompilation)
- 头文件的预编译(precompilation)确保头文件只需编译一次,不必每次用到的时候,都重新编译。4. 预处理(Preprocessing)
- 替换掉源码中bash的头文件和宏
- 移除注释
5. 编译(Compilation)
- 源码转为汇编码(assembly),然后再把汇编码转为机器码。
- 转为汇编码后的文件称为对象文件(object file)。
6. 连接(Linking)
- 把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。
  1. 安装(make install)
将可执行文件保存到用户事先指定的安装目录(拷贝过去就行了),需要创建目录、保存文件等权限。

四、MarkFile

构建规则都写在Makefile文件里面,要执行 Make命令,就必须学会如何编写 Makefile文件。

规则:

<target>: <prerequisites> <commands>

如:

clean:rm *.o

如:

all: build-js build-cssbuild-js: browserify -t brfs src/app.js > site/app.jsbuild-css:stylus src/style.styl > site/style.css.PHONY build-js build-css

五、Reference:

compiler

make

build website with make

Make 命令升级 Nginx

  • nginx 使用服务信号升级
# 准备工作
# ./configure && make && make install # 旧版安装 nginx 1.16# 开始升级, 新版打包
./configure && make # 新版 nginx 1.20
# 备份原有的二进制 nginx
mv nginx oldnginx
# 更新 nginx 二进制文件
cp ~/nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/
# 复制得到新的进程(根据新的二进制文件运行的进程)
kill -USR2 'more /usr/local/nginx/logs/nginx.pid'
# 退出旧版本
kill -QUIT 'more /usr/local/nginx/logs/nginx.pid.oldbin'

原理: kill -USR2 PID # 这样会复制一份,并得到nginx.pid.oldbin文件,再继续运行kill -QUIT OLDPID 这样平滑更新就完成了。

kill 命令信号:TERM/INT、 QUIT、 HUP、 USR1、 USR2、 WINCH

  • nginx 使用make命令升级
# 准备工作
./configure && make && make install # 旧版
./configure && make # 新版
# 备份原有的二进制 nginx
mv nginx oldnginx
# 更新 nginx 二进制文件
cp ~/nginx-1.17.1/objs/nginx /usr/local/nginx/sbin/
# 在新版本的根目录下执行
make upgrade
  • nginx 更新模块
# 查看之前安装的模块有哪些(需要添加到后面)
nginx -V
# 清理
make clean
# 模块更新
./configure --without.... --with...
# 编译
make
# 更新
mv objs/nginx /opt/nginx/sbin/ && make upgrade

make 和 make install 命令相关推荐

  1. linux install命令文件夹,详解Linux系统中的install命令的用法

    用法:install [选项]... [-T] 源文件 目标文件 或:install [选项]... 源文件... 目录 或:install [选项]... -t 目录 源文件... 或:instal ...

  2. python-如何解决python执行pip install 命令的时候出现 File“<stdin>“,line 1 pip install XXX的问题

    python-如何解决python执行pip install 命令的时候出现 File"",line 1 pip install XXX的问题 参考文章: (1)python-如何 ...

  3. linux shell install 命令简介

    用法:install [选项]... [-T] 源文件 目标文件 或:install [选项]... 源文件... 目录 或:install [选项]... -t 目录 源文件... 或:instal ...

  4. install命令和cp命令的区别

    基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务--拷贝文件,它们之间的区别主要如下: 1.最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件 ...

  5. 有人在代码里下毒!慎用 pip install 命令

    大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI,https://discuss.python.org/t/what-method ...

  6. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...

    原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...

  7. linux下如何使用configure/make/make install命令编译安装卸载程序

    源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install).安装成功的源码就是所谓的可执行文件,在你不需要的时候,也是可以删除/卸载(remove/u ...

  8. php中没有dockerfile,Dockerfile在RUN composer install命令中没有使用缓...

    我以为我已经理解了Docker,但今天我发现了一些关于利用docker缓存的问题. 这是我的dockerfile FROM quay.io/my_company/phpjenkins WORKDIR ...

  9. maven自带clean_maven之clean、install命令

    1.进入到maven根目录,执行mvn compile命令会在根目录生成target文件(参照maven之helloworld案例),如下图: 2.执行mvn clean可将根目录下生成的target ...

  10. 运行npm install命令后的执行过程

    发出npm install命令 npm向registry查询模块压缩包的下载地址 下载压缩包并存放到本地npm缓存路径(~/.npm目录) 解压到当前项目node_modules目录 如果你没联网,n ...

最新文章

  1. IDEA新建一个多maven模块工程(有图)
  2. ARP扫描工具arp-scan
  3. Awesome Tools Site
  4. 静态构造函数和静态成员变量初始化的调用时间
  5. C++中判断某一文件或目录是否存在
  6. 程序编译与代码优化 -- 早期(编译期)优化
  7. B VUE系列 三:vuex,vue全局变量管理和状态更新的利器
  8. 一维欧拉方程matlab代码,一维欧拉方程组的warming-beam差分求解
  9. linux怎样重启命令,Linux重启命令介绍
  10. android 字符串 声波,识别成功率100%的声波配网,看完你也可以实现一个
  11. matlab线性代数对角化,工程线性代数(MATLAB版) (2007年7月)
  12. VSTO之一:Word外接程序
  13. Java锁synchronized关键字学习系列之CAS和对象头
  14. ODL开发【SDN控制器-下】【C4-04】
  15. SQL AlawaysOn 之一:安装域控制器
  16. python随机森林模型简单股票涨跌预测
  17. 虚拟机概论(六)——JAVA虚拟机模型 (转载)
  18. 人在旅途——》张家界5天出行
  19. 后台管理系统中的CRUD【以用户维护为例】
  20. 怎么退出用户登录linux,linux如何退出用户

热门文章

  1. OSZICAR文件详解
  2. PLGA纳米粒负载环丙沙星Ciprofloxacin-PLGA|甲硝唑修饰PLGA纳米粒PLGA-Metronidazole
  3. 智慧仓储管理系统,是否能解决购物狂欢节后新一轮爆仓危机?
  4. Transformer、Bert、GPT简介
  5. 最新版按键精灵一共有5个插件命令可以获取窗口句柄
  6. Qt之实现360安全卫士主界面
  7. 元宇宙体育俱乐部 #kodeclubs 基于threejs的网页版虚拟空间
  8. WordPress自媒体主题源码
  9. 各种编码格式,非常经典
  10. 防脱发 : 一招远离秃顶!