环境工具:autoconf、automake、make
1、执行autoscan命令生成autoscan.log和configure.scan文件
2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in),这里要修改configure.ac
3、使用aclocal生成aclocal.m4文件
4、执行autoconf命令生成configure文件
5、执行autoheader命令生成config.h和config.h.in
6、创建一个Makefile.am文件
7、touch NEWS README AUTHORS ChangeLog
8、执行 automake --add-missing ,Automake 会根据 Makefile.am 文件产生一些文件,包含最重要的Makefile.in
9、执行./configure 命令生成Makefile文件
文件configure.ac
-
-*- Autoconf -*-
-
# Process this file with autoconf to produce a configure script.
-
-
AC_PREREQ([2.68])
-
AC_INIT(hello, 1.0,[email])
-
AM_INIT_AUTOMAKE(hello, 1.0)
-
AC_CONFIG_SRCDIR([hello.c]) #用于检测源码目录的有效性,任选一个源码文件即可
-
AC_CONFIG_HEADERS([config.h]) #用于生成config.h文件,以便autoheader使用
-
-
# Checks for programs.
-
AC_PROG_CXX
-
AC_PROG_CC
-
#LT_INIT #编译libtool必须添加的两行,这里直接编译成so,故不需要
-
#AC_PROG_LIBTOOL
-
# Checks for libraries.
-
# Checks for header files.
-
# Checks for typedefs, structures, and compiler characteristics.
-
# Checks for library functions.
-
-
AC_CONFIG_FILES([Makefile ]) #需要生成的所有Makefile
-
-
AC_OUTPUT
Makefile.am
-
AUTOMAKE_OPTIONS= foreign
-
bin_PROGRAMS= hello
-
hello_SOURCES= hello.c
在上面产生的中间文件中,开发者需要设置的有configure.ac和Makefile.am,下面介绍这两个文件中常用宏的意义。
configure.ac文件:autoconf 是用来产生 'configure'文件的工具。'configure' 是一个 shell script,它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的 Unix 系统。autoconf 会读取 configure.ac文件然后产生'configure' 这个shell script。configure.ac文件内容是一系列 GNU m4 的宏,这些宏经 autoconf 处理后会变成检查系统特性的 shell scripts。configure.ac文件中宏的顺序并没有特别的规定,但是每一个 configure.in 文件必须在所有其它宏前加入 AC_INIT宏,然后在所有其它宏的最后加上 AC_OUTPUT 宏。常用到的宏如下:
dnl和#:这个宏后面的内容不会被处理,可以视为注释
AC_INIT(FILE):该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION):这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。一般autoscan不会产生,需要手动添加
AC_PROG_CC:检查系统可用的 C 编译器,若源代码是用 C 写的就需要这个宏。
AC_OUTPUT(FILE):设置 configure 所要产生的文件,若是 Makefile ,configure 便会把它检查出来的结果填充到 Makefile.ac文件后产生合适的 Makefile。
实际上,在使用 automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal 来帮助产生。执行 aclocal 会产生 aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 automake 如何动作。有了 configure.ac 及 aclocal.m4 两个文件以后,便可以执行 autoconf 来产生configure 文件了.
Makefile.am 文件:Automake 会根据 configure.ac 中的宏并在 perl 的帮助下把 Makefile.am 转成 Makefile.in 文件。Makefile.am 文件定义所要产生的目标,下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则:
整个Makefile.am就是按照上面三个表格来编写的,不管是编写可执行文件还是动态库。对照着上面的表格,来解释我们hello程序的Makefile.am:
AUTOMAKE_OPTIONS:设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行 Automake 时 ,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。设置为 foreign 时,Automake 会改用一般软件的标准来检查,此时不需要这些文件
bin_PROGRAMS:定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。
hello_SOURCES:定义 'hello' 这个执行程序所需要的原始文件。如果 'hello'这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 'hello' 还需要 'hello.c'、'main.c'、'hello.h' 三个文件的话,则定义hello_SOURCES= hello.c main.c hello.h。如果定义多个执行文件,则对每个执行程序都要定义相对的 filename_SOURCES。
LDADD:一般用于指明本项目自己生成的库,而LDFLAGS一般使用-l等指明本项目依赖的第三方库,如opencv库。另外由于一个Makefile.am中可能会生成多个动态库、可执行文件等,所以如果使用LDADD,则是为所有的库或者执行文件指定依赖库,如果使用hello_LDADD则是为hello应用程序指定依赖库,类似于全局变量和局部变量的关系
aclocal,autoheader,autoconf,automake --add-missing
./configure
make
libtool
libtool命令的主要作用是创建和使用可移植的共享(动态链接)库。
其他相关命令
ifnames 命令可以列出程序中的预处理标示符,比如#if,#ifdef等。
m4 处理文件中的宏。
pkg-config 查询已安装库的接口。