千家信息网

Linux中的configure,make,make install到底在做些什么

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。有时候我就在想,这个congigure,make ,make
千家信息网最后更新 2025年02月08日Linux中的configure,make,make install到底在做些什么

在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。

有时候我就在想,这个congigure,make ,make install是什么意思呢,configure是测试存在的特性,然后make开始编译,make install生成相应的可执行文件。但是一个工具只是记住了其中的拼写部分或是基本的概念,但是对于原理知之甚少,也是需要补补了。

几个构建编译隐藏的命令

要先说这个编译安装过程,使用命令aclocal会生成m4文件,aclocal本质上是一个perl脚本。先提提m4, m4是一种宏处理器,它是 POSIX 标准的一部分。为什么叫m4呢,全称是macro,m后面有4个字母,据说是这样的,哈哈。摘录一段对于m4的描述:从图灵的角度来看 m4,输入流与输出流可以衔接起来构成一条无限延伸的纸带,m4 是这条纸带的读写头,所以 m4 是一种图灵机。m4 的计算能力与任何一种编程语言等同,区别只体现在编程效率以及所编写的程序的运行效率方面。

然后是autoconf,是生成configure文件的,configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

最后是automake用来生成Makefile.in文件

简单总结一下,这个编译过程涉及几个命令工具,大体的功能点如下。

aclocal # 产生 aclocal.m4
autoconf # 根据 configure.in 生成configure
automake --add-missing # 根据 Makefile.am生成Makefile.in

网上找到一张总结的很牛的图,很全面。

构建过程环境准备

我们写个简单的Hello world来了解下整个过程吧。

我写了一段非常简单的c程序,就凑合着编译着用吧。文件为main.c

#include
int main(int argc, const char *argv[])
{
printf("Hello world ,a new test\n");
return 0;
}

可以看出,程序运行后的输出就是Hello world,a new test

我们看看构建GNU程序中如何按照规范来模拟这个过程

我们创建一个文件configure.ac,里面是一些宏,是接下俩的autoconf来处理的需要的,然后交给automake来处理,最终完成这个检查。

AC_INIT([helloworld],[0.1],[xxx@xxx.com])
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

比如AC_INIT([helloworld],[0.1],[xxx@xxx.com])的含义是autoconf生成包的名字,版本(这个可以自己定义),反馈邮箱,

AM_INIT_AUTOMAKE是检查automake尝试Makefile时的工具,AC_PROG_CC是编译器检测,AC_CONFIG_FILES是automake构建出类似.in的文件。

然后就是Makefile的文件,我们设定名字为Makefile.am,这部分的内容和上面的配置是密切相关的。

[root@oel64 tmp]# cat Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS = helloworld
helloworld_SOURCES = main.c

automake提供了3种软件等级:foreign、gnu和gnits。默认等级是gnu。此处AUTOMAKE_OPTIONS使用的是foreign,表示只检测必要的文件。

bin_PROGRAMS定义了要产生的执行文件名,这里我们定义为helloworld

file_SOURCES定义file这个执行程序的依赖文件,其中"file_SOURCES"中的前部分"file"要改写成可执行文件名,即与bin_PROGRAMS定义的名称一致,此处就是helloworld了。如果有多个可执行文件,那就要定义相应的file_SOURCES。

构建过程实践

到目前为止,我们创建了3个文件 main.c,configure.ac,Makefile.am

[root@oel64 c]# ll
-rwxr-xr-x. 1 root root 108 Sep 13 12:13 configure.ac
-rw-r--r--. 1 root root 105 Sep 13 12:13 main.c
-rw-r--r--. 1 root root 79 Sep 13 12:13 Makefile.am
首先使用aclocal来得到m4文件。这里生成了2个文件,一个是aclocal.m4,另外一个是cache文件autom4te.cache
[root@oel64 c]# aclocal
[root@oel64 c]# ll
total 56
-rw-r--r--. 1 root root 34611 Sep 13 12:14 aclocal.m4
drwxr-xr-x. 2 root root 4096 Sep 13 12:14 autom4te.cache
-rwxr-xr-x. 1 root root 108 Sep 13 12:13 configure.ac
-rw-r--r--. 1 root root 105 Sep 13 12:13 main.c
-rw-r--r--. 1 root root 79 Sep 13 12:13 Makefile.am
然后使用autoconf得到configure文件
[root@oel64 c]# autoconf
[root@oel64 c]# ll
-rw-r--r--. 1 root root 34611 Sep 13 12:14 aclocal.m4
drwxr-xr-x. 2 root root 4096 Sep 13 12:14 autom4te.cache
-rwxr-xr-x. 1 root root 135288 Sep 13 12:14 configure
-rwxr-xr-x. 1 root root 108 Sep 13 12:13 configure.ac
-rw-r--r--. 1 root root 105 Sep 13 12:13 main.c
-rw-r--r--. 1 root root 79 Sep 13 12:13 Makefile.am
然后使用automake来构建模块
[root@oel64 c]# automake --add-missing
configure.ac:2: installing `./install-sh'
configure.ac:2: installing `./missing'
Makefile.am: installing `./depcomp'
整个过程完成之后,就是我们平常执行的操作了。

执行configure的结果如下:

[root@oel64 c]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
[root@oel64 c]#
然后是make,这个过程你可以清晰的看到gcc开始编译。
[root@oel64 c]# make
gcc -DPACKAGE_NAME=\"helloworld\" -DPACKAGE_TARNAME=\"helloworld\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"helloworld\ 0.1\" -DPACKAGE_BUGREPORT=\"xxx@xxx.com\" -DPACKAGE=\"helloworld\" -DVERSION=\"0.1\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o helloworld main.o
最后是make install,有了可执行的程序文件。
[root@oel64 c]# make install
make[1]: Entering directory `/root/c'
test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
/usr/bin/install -c helloworld '/usr/local/bin'
make[1]: Nothing to be done for `install-data-am'.
make[1]: Leaving directory `/root/c'

比如编译后的main.o,如果使用strings来查看内容就是执行后的结果。
[root@oel64 c]# strings main.o
Hello world ,a new test
如果查看可执行程序helloworld的内容,里面是有相应的堆栈的。
[root@oel64 c]# strings helloworld
/lib64/ld-linux-x86-64.so.2
__gmon_start__
libc.so.6
puts
__libc_start_main
GLIBC_2.2.5
fff.
手工执行一下 。

[root@oel64 c]# ./helloworld
Hello world ,a new test






文件 编译 过程 生成 程序 就是 工具 不同 内容 命令 系统 处理 操作系统 名字 图灵 平台 文件名 等级 纸带 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海市网络技术安全测评 网络安全行业的分销体系 手机使用网络安全心得体会 荣昌区网络软件开发流程要求 沈阳安卓应用软件开发哪家公司好 如何搭建云服务器渲染 python创造数据库 广东售后维修管理软件开发 苹果软件开发手续费 数据库中private什么意思 欧瑞斯丹网络技术宁波 我的世界服务器村民盔甲 数据库没有及时关闭有什么影响 软件开发应注意协议 海南州网络技术操作 服务器工程师考试题库 接口服务器 学校网站需要注册web服务器吗 上海联影医疗软件开发 信用社网络安全考试题库 电脑突然连接远程数据库失败 委托代征软件开发 安全实验平台的服务器图片 独立软件开发商资质 巴中市网络安全和信息化委员会 软件开发时版本是什么 数据库能存在香港云服务器吗 存储数据库排行 重启公司网站服务器 魔兽世界80级是什么服务器
0