大家好,很高兴再次与大家见面,我是你们的朋友全栈君。
1、在大型项目编译过程中,JavaScript代码的运行次数为0。以下是关于linux中./configure、make和make install命令的详细解释:
1)./configure:这是一个脚本,通常由Autoconf工具生成,用于检查当前系统环境是否满足安装软件的必要条件,例如系统是否支持该软件,以及软件依赖是否已安装。configure脚本会生成一个Makefile文件。
2)make:这是一个命令,使用第一步生成的Makefile文件。如果只运行make命令而不指定目标,通常会编译源代码。
3)make install:这表示运行目标为install的make命令,将编译后的结果复制到相应的目录中。
2、使用Autoconf工具的过程:
Autoconf是autotools系列工具中的一个,运行后可以处理configure.in脚本配置文件,生成可执行的configure文件。其主要目的是简化Makefile文件的编写。涉及到的几个重要过程如下:
- 使用aclocal命令生成m4文件(全称是macro,m后面有4个字母)。m4是一种宏处理器,是POSIX标准的一部分。
- autoconf用于生成configure文件。configure是一个脚本,可以根据不同的操作系统平台设置源程序,并生成合适的Makefile,使源代码能够在不同平台上编译。
- automake用于生成Makefile.in文件。
简单总结一下,这个编译过程涉及几个命令工具,大体的功能点如下:
- aclocal:产生aclocal.m4
- autoconf:根据configure.in生成configure
- automake –add-missing:根据Makefile.am生成Makefile.in
整个流程图如下:
具体操作过程:
在源码根目录调用autoscan脚本,生成configure.scan文件。在指定目录及其子目录树中检测源文件,如果未指定目录,则在当前目录及其子目录树中检查。修改configure.ac文件,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目,编写自定义宏,建议每个宏单独存储在一个*.m4文件中。调用aclocal收集configure.ac中用到的各种非Autoconf的宏,包括自定义宏。调用autoheader,扫描configure.ac(或configure.in)、acconfig.h(如果存在),生成config.h.in宏定义文件,主要根据configure.ac中某些特定宏(如AC_define)生成的#define和#undefine宏,configure将根据实际的探测结果决定这些宏是否定义。按照automake规定的规则和项目的目录结构,编写一个或多个Makefile.am文件(Makefile.am的数量和存放位置与源码目录结构相关),Makefile.am主要编写的是编译目标及其源码组成。调用automake,将每个Makefile.am转换成Makefile.in,同时生成满足gnu编码规范的一系列文件(使用-a选项可自动添加缺少的文件,但有几个仍需手动添加,在执行automake前需执行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定义了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步骤前先在项目根目录执行libtoolize –automake –copy –force,以生成ltmain.sh,供automake和config.status调用。调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。用户调用configure,生成Makefile,然后执行make和make install。
需要操作的过程:
-
【修改configure.ac文件】:添加AM_INIT_AUTOMAKE宏,AM_INIT_AUTOMAKE是检查automake尝试Makefile时的工具,传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)。AC_CONFIG_HEADERS([config.h])宏的目的是输出config.h,这是一个C的头文件,里面主要包含很多宏定义#define。输出这个文件的目的是提供各种相关的宏。添加编译链接需要的程序:AC_PROG_CXX、AC_PROG_CC、AC_PROG_RANLIB。如果使用libtool编译,则选项如下,注意使用了libtool则需要将AC_PROG_RANLIB去掉:LT_INIT。在AC_OUTPUT上一行添加AC_CONFIG_FILES宏,添加这个宏的目的是指定Autoconf输出哪些文件,常见的文件就是Makefile文件,config.h在AC_CONFIG_HEADERS宏里面指定了,这里不需要再次指定。例如:
-
【编写Makefile.am文件】:三大原则:编写Makefile.am主要是完成3件事情:编译(make)、安装(make install)、打包(make dist)。1)原则1:每个目录一个Makefile.am文件;同时在configure.ac的AC_CONFIG_FILES宏中指定输出所有的Makefile文件,例如:2)原则2:父目录需要包含子目录。3)原则3:Makefile.am中指明当前目录如何编译。编译安装:编译和安装的规则是绑定在一起的,通过同一条语句同时指定了编译和安装的处理方式。具体的格式为:安装目录_编译类型=编译目标。1.1:常用缺省的安装目录如下:
目录 Makefile.am中的变量 使用方式 prefix /usr/local 安装目录,通过–prefix指定 exec_prefix ${prefix} 同prefix bindir ${exec_prefix}/bin bin_编译类型 libdir ${exec_prefix}/lib lib_编译类型 includedir ${prefix}/include include_编译类型 noinstdir 无 noinst_编译类型,特殊的目录,表示编译目标不安装。 自定义目录:在根目录下的Makefile.am中添加如下内容:configdir=${prefix}/config => 定义一个自定义的目录名称config,注意dir后缀是固定的。config_DATA=config/test.ini => 使用自定义的目录config,必须要有这句,否则目录不会创建,等号后面如果有对应的文件,安装时会将对应的文件拷贝到config目录下。
1.2:编译类型:
类型 说明 使用方式 PROGRAMS 可执行程序 bin_PROGRAMS LIBRARIES 库文件 lib_LIBRARIES LTLIBRARIES libtool库文件 lib_LTLIBRARIES HEADERS 头文件 include_HEADERS SCRIPTS 脚本文件,有可执行权限 test_SCRIPTS(需要自定义test目录) DATA 数据文件,无可执行权限 conf_DATA(需要自定义conf目录)
3、实例:
源文件:hello.c。运行autoscan得到configure.scan文件,将该文件重命名为configure.ac,编辑如下:此文件的相关内容需要根据软件和系统的环境进行配置,但是AM_INIT_AUTOMAKE宏需要自己添加,它是automake所必备的宏。
执行aclocal用于扫描configure.ac文件生成aclocal.m4,告诉autoconf如何找到新的宏。执行autoheader,会生成一个config.h.in文件。执行autoconf生成configure。编写Makefile.am文件:Automake工具会根据configure.in中的参量把Makefile.am转换成Makefile.in文件。
新建NEWS、AUTHORS、README、ChangeLog文件。执行automake –add-missing或者第7、8步骤可用automake -a命令自动添加文件。执行./configure,它将makefile.in文件生成Makefile文件。最后执行make,生成了可执行文件hello。
make install将安装到/usr/local/lib库中。
参考资料:
- 大型项目使用Automake/Autoconf完成编译配置
- Linux中的configure,make,make install
- linux 源码编译 ./configure 的配置和用法
- autoconf手册
发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/4187252aad1f374c3adad9cdf1a8cdc2
原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c