./configure & make & make install 知其所以然
最近一直在类unix系统上(Ubuntu和Mac OS)上调研第三方的一些开源库,要涉及到开源库的编译安装工作,接触最多的就是./configure & make & make install。
以前我们在Windows上进行开发的过程中,使用Visual Studio打开sln直接一个按钮就编译生成最终的可执行文件,具体的编译过程不得而知,而在类unix系统中这些过程都得自己来搞,麻烦是麻烦了些,但是能学到深层次的知识。
GNU构建系统(GNU Build System)主要是指通过autoconf、automake和libtool这三个工具构建出来的软件结构体系,又名Autotools。
GNU构建系统是利用脚本和make程序在特定的平台上构建软件的过程。一般过程是./configure,make,make install 三部曲。这种方式成为一种习惯,被广泛使用。
一般github上的开源项目都提供了使用这套构建系统的入口,要么是使用make程序,要么是使用更高级点的cmake。
下图(来自维基百科)展示了GNU构建体系编辑和使用的流程:浅蓝色矩形作为处理工具的输入,椭圆作为处理工具,最终的浅绿色矩形为最终的可执行文件输出。
最关键的一部就是生成makefile文件,之后调研make & make install只是常规的步骤。
其中congure.ac、makefile.am是库作者最好必须提供的。
在ubuntu上可以使用 sudo apt-get autoconf automake libtool来安装AutoTools。
接下来,我们来看两个开源库例子:
- gperftools:google性能工具集合,包括heap checker、heap profiler、tcmalloc以及cpu profiler。
里面有个shell脚本文件autogen.h,用于产生configure脚本,进而使用configure脚本来生成makefile文件,autogen.h内容如下:
仔细点看,不是使用的我们上面所说的autoconf,而是autoreconf,从最开始的一幅图可知,autoconf接收aclocal.m4以及configure.ac作为输入,这事先需要使用aclocal工具来生成aclocal.m4,是有个先后顺序的,如果autoconf接收的输入多了,先后顺序也就会增多,不方便管理。而此时autoreconf则显现出作用,它是一个辅助工具,可以将上述所述的先后顺序自动地以正确的顺序调用,而不用关心具体的细节,简直是方便了太多。
执行autoconf(这里执行的是autogen.sh脚本)就生成了我们的configure脚本,直接调用./configure就可以生成我们的makefile了,当然,如果需要定义一些细节,则可以在./configure后添加选项参数(./configure -help查看可以自定义哪些选项),最后就是make&make install了。
- thrift:apache的rpc框架
提供的文件和上面的gperftools差不多,多了CMakeLists.txt告知我们可以使用cmake的方式来构建,但最终还是要生成makefile文件,这里有一个shell脚本文件bootstrap.sh需要重点看下:
可以看到,最后执行的autoscan、aclocal、autoheader、autoconf、automake,说的还是最开始图中所说的那个流程,都能走到生成makefile的一步。
./configure & make & make install三部曲,万变不离其宗!
上面通过梳理学习,了解了开源项目的大致文档结构,如果我们自己搞开源库,也可以这样来组织,可参考例解 autoconf 和 automake 生成 Makefile 文件。
./configure & make & make install 知其所以然的更多相关文章
- 【转】./configure && make && make install详解
在Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INSTALL两个说明文件,这两个文件会清楚的告诉你如何可以正确的完成这个软件的安装! 我们都知道源 ...
- CentOS ./configure && make && make install详解
码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). 在Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INST ...
- ./configure && make && make install详解 (转)
在Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INSTALL两个说明文件,这两个文件会清楚的告诉你如何可以正确的完成这个软件的安装! 我们都知道源码包安装分为这么几个 ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
- [转]./configure,make,make install的作用
./configure,make,make install的作用(转) 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台 ...
- [linux笔记]理清linux安装程序用到的(configure, make, make install)
我作为一名经常和linux打交道的程序员,每次在linux安装软件都祈求可以用——apt-get,yum,brew等应用程序管理器安装,有的时候事与愿违,你只能自己编译安装-wtf,说好的美丽世界呢? ...
- configure, make, make install都做了什么
1. 我的理解./configure: 确保接下来的make以及make install所依赖的文件没有问题make: build编译连接生成可执行程序make install: 将编译好的可执行 ...
- 【转】configure/make/make install的使用说明
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC ...
- The magic behind configure, make, make install
原文:https://robots.thoughtbot.com/the-magic-behind-configure-make-make-install#where-do-these-scripts ...
随机推荐
- MySQL数据库 存储引擎,创建表完整的语法,字段类型,约束条件
1.存储引擎 - 存储引擎是用于根据不同的机制处理不同的数据. - 查看mysql中所有引擎: - show engines; - myisam: 5.5以前老的版本使用的存储引擎 - blackho ...
- 重新学习SpringMVC——基础
2. SpringMVC_HelloWorld3. SpringMVC_RequestMapping_修饰类4. SpringMVC_RequestMapping_请求方式5. SpringMVC_R ...
- Dubbo支持的协议(四)
1. Dubbo Dubbo 官方推荐的协议 本质:使用 NIO 和线程池进行处理 缺点:大文件传输时可能出现文件传输失败问题. 2. RMI JDK 提供的协议,远程方法调用协议 缺点:偶尔连接失败 ...
- Linux SSH建立连接过程分析
https://blog.csdn.net/qwertyupoiuytr/article/details/71213463 SSH建立连接的过程主要分为下面几个阶段: SSH协议版本协商阶段.SSH目 ...
- Linux服务器惨遭挖矿
昨天为了协助客户测试业务,帮客户开通了一台云主机,因为是测试环境所以密码设置的很简单:1qaz@WSX,今天登陆的是否发现密码认证不通过了,确定机器是被黑掉了,估计多半是被国外小哥入侵挖矿了,记录 ...
- pagehelper超过页数仍然可以查出数据
spring boot中pageHelper的使用 pom文件中添加 <!--pagehelper --> <dependency> <groupId>com.gi ...
- Nexus 私服上传文件,并通过 Gradle 引用
一.上传文件到 Nexus 1,进入 Nexus 仓库界面 如果你电脑还没有使用 Nexus,需要先下载并启动 Nexus 私服. 在浏览器输入:http://127.0.0.1:8081/nexus ...
- 缓存原理,自己写一个缓存类(c#版)
.net中的MemoryCache是通过内部封装一个静态Dictionary 自己写一个缓存,来看看内部怎么实现的 public class CustomerCache : ICache { priv ...
- [LeetCode] 908. Smallest Range I 最小区间
Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...
- [LeetCode] 885. Spiral Matrix III 螺旋矩阵之三
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...