工具介绍
需要用到autoscan,aclocal,autoconf,automake这几个工具。在ubuntu中,我们通过apt-get install命令,系统会自动为我们安装所有工具,不需要手动去下载。在执行完这些命令之后,编译目录下才会生成configure文件,之后我们可以通过熟悉的"./configure",“make”,"make install"命令进行代码的编译和安装。
autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们在实际使用过程中,往往把configure.scan文件改成configure.in或者configure.ac文件。
aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
automake用来生成Makefile.in文件。Those .in files will be used by autoconf scripts to produce the final Makefiles(是用来生成Makefile文件的,所以是比较重要的文件)
生成makefile并make的流程
流程关系图
操作在包含源文件的项目目录下进行。
(1). 运行autoscan,生成文件configure.scan。
(2). 修改configure.scan,改名为configure.in。
(3).运行autoheader,生成文件configure.h.in(现在一般改为configure.ac)。configure.in里有宏AC_CONFIG_HEADER()时用。
(4).运行libtoolize,生成一些支持文件,ltmain.sh。需要用libtool生成共享库用。
(5).运行allocal,生成aclocal.m4。
(6). 运行autoconf,生成configure。
(7).为源文件编写makefie.am,每一个包含源文件的目录和子目录都有一个makefile.am。
(8).运行automake,生成makefile.in,每个包含makefile.am的子目录都生成makefile.in。
automake -a选项可以补齐文件config.guess,config.sub,install-sh,missing,depcomp。
(9).运行./configure,生成config.status,config.h,makefile。
(10).运行make,生成中间文件对象文件,库文件,最后生成可执行文件。
(11).运行make install,相应的可执行文件,库文件,头文件拷贝到系统相应位置。
搭建编译工程
【工程目录】
模块注释:
driver:驱动代码
software:模块代码根目录
-alarm 告警模块
-common 公共模块
-config 配置模块
-ctrl 主控模块
-lib 存放编译好之后的so动态库
-lib_source 第三方库的源代码
-ptz 云台控制模块
-rtp RTP流媒体模块
-sdkserver sdk服务模块
-server 消息通信服务模块
-storage 存储模块
-webclient CGI模块
-xml 存放XML配置文件
【执行过程】
步骤1:在software目录下,使用autoscan扫描当前目录(它会自动扫描子目录,所以你只需要在根目录下执行一次即可),会在software下面生成configure.scan文件,如前面说过的,我们需要把configure.scan文件改名为configure.in,否则无法被其他工具识别
1.autoscan
2.mv configure.scan configure.in
改名后,我们还需要根据自己的实际情况,对configure.in文件进行修改。工具的版本不同,生成的configure.in文件也可能不同,不过我们只需要关注极少部分即可。
注:实际使用过程中,你只需要关注我用红色箭头所标识的几个宏命令就可以了,其他的宏命令还有很多,需要你自己根据实际情况查阅手册获取使用方法。
步骤2.
在software下面执行aclocal命令,生成aclocal.m4文件。(若autoscan.in文件缺少了AC_INIT_AUTOMAKE宏,就无法生成aclocal.m4文件)
步骤3.
在software下面执行autoconf命令,生成configure文件。
注:autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预,要生成configure,必须用到aclocal.m4。
步骤4.
configure脚本已创建,若这时候执行./configure命令,会提示出错,如下
config.status: error: cannot find input file: `Makefile.in’
因为到目前为止,我们还没有把Makefile.in文件生成出来,那么如何生成Makefile.in呢?我们首先需要编写Makefile.am文件,看看后缀名.am,我们就可以知道,这个Makefile.am是给automake工具使用的,通过Makefile.am文件,我们把Makefile.in生成出来,然后通过./configure命令读取执行Makefile.in,把makefile生成出来。最后才是我们的"make"和“make install"
应该说,automake只要按部就班,依照顺序敲几个命令是非常容易的,唯一麻烦的就是写Makefile.am文件,我们需要在每个参与编译的子目录下都创建一个Makefile.am文件。虽说在整个创建流程中,Makefile.am是最繁琐的一步(考虑到子目录可能比较多的情况),但是相对比起自己写每一个makefile文件,还是要轻松许多的。
1.我们首先创建software/Makefile.am文件,怎么写呢?
可以看到,我在里面设了两个变量,SUBDIRS和AUTOMAKE_OPTIONS. 这两个是系统自带的变量,类似于这种系统自带的变量后面还会看到。
SUBDIRS变量,顾名思义,就是子目录的意思,应为software是工程根目录,所以,我们只需要在这个Makefile.am中指明子目录有哪些就可以了,在执行过程中,会自动到子目录下面去寻找对应的Makefile.am,所以说还是相当简单的。
AUTOMAKE_OPTIONS变量,看图就知道了,不解释。
2.创建好根目录下的Makefile.am,