5. automake 和 autoconf 使用简明教程
来源:互联网 发布:php如何实现常驻内存 编辑:程序博客网 时间:2024/06/07 12:27
原文地址 http://www.nuvoton.com/hq/products/microprocessors/arm9-mpus/n3292-h.264-codec-series/?__locale=zh_TW
5.1. 步骤概览
- create project
- touch NEWS README ChangeLog AUTHORS
- autoscan
- configure.scan ==> configure.in/configure.ac
- aclocal
- autoheader(可选,生成config.h.in)
- Makefile.am(根据源码目录可能需要多个)
- libtoolize –automake –copy –force(如果configure.ac中使用了libtool)
- automake –add-missing
- autoconf
- ./configure && make && make install
5.2. 修改configure.scan ==> configure.ac
- 在AC_INIT 宏下一行添加AM_INIT_AUTOMAKE([foreign -Wall -Werror]),选项可根据自己需要修改,选项参见automake手册。
- 若需要使用config.h的宏,添加AC_CONFIG_HEADERS([config.h])宏。
- 配置编译环境。AC_PROG_CXX->g++, AC_PROG_CC->gcc AC_PROG_RANLIB->libs,LT_INIT->使用libtool,库可以指定PKG_CHECK_MODULES()。
- 添加自己的检测处理(可选)。
- 在AC_OUTPUT上一行添加AC_CONFIG_FILES宏,指定输出的文件。如:AC_CONFIG_FILES([Makefile tools/Makefile])
5.2.1. pkg-config的使用
为使工程支持pkg-config,提供了以下的几个autoconf宏
PKG_PROG_PKG_CONFIG([MIN-VERSION]): 判断系统中的pkg-config及其版本符合兼容性要求。 PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]): 检查系统中是否有某些模块。 PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]): 检查系统中是否有某些模块,如果是则根据pkg-config –cflags 和 pkg-config –libs的输出设置<VARIABLE-PREFIX>_CFLAGS and <VARIABLE-PREFIX>_LIBS变量。
5.3. 编写自定义的Autoconf宏(一般不需要)
Autoconf的自定义宏在configure.ac中调用。 #. 新建m4目录,在该目录中编写xxx.m4宏,运行aclocal -I m4生成aclocal.m4: #. 在Makefile中添加ACLOCAL_AMFLAGS = -I m4
5.4. 编写Makefile.am
- 每个目录一个Makefile.am文件;同时在configure.ac的AC_CONFIG_FILES宏中指定输出所有的Makefile文件。
- 父目录Makefile.am包含子目录:SUBDIRS=test tools
- Makefile.am中指明当前目录如何编译。
5.4.1. 编译方式
5.4.2. 编译目标
编译目标其实就是编译类型对应的具体文件,其中需要make生成的文件主要有如下几个:可执行程序_PROGRAMS,普通库文件_LIBRARIES,libtool库文件_LTLIBRARIES,其它类型对应的编译目标不需要编译,源文件就是目标文件。 例如,对于bin_PROGRAMS = target
target_SOURCES:对应gcc命令中的源代码文件target_LIBADD:编译链接库时需要链接的其它库,对应gcc命令中的*.a, *.so等文件target_LDADD:编译链接程序时需要链接的其他库,对应gcc命令中的*.a, *.so等文件target_LDFLAGS:链接选项,对应gcc命令中的-L, -l, -shared, -fpic等选项target_LIBTOOLFLAGS:libtool编译时的选项target**FLAGS(例如_CFLAGS/_CXXFLAGS):编译选项,对应gcc命令中的-O2, -g, -I等选项
5.4.3. 编译可执行程序
将非main函数所在目录的文件编译成静态链接库,然后采用链接静态库的方式编译可执行程序。 main函数所在目录的文件加到XXX_SOURCES变量中。
5.4.4. 编译库
Automake天然支持编译静态库,只需要将编译类型指定为_LIBRARIES即可。
5.4.4.1. 动态库
需要注意的是:_LIBRARIES只支持静态库(即*.a文件),而不支持编译动态库(*.so)文件,要编译动态链接库,需要使用_PROGRAMS。
除此之外,还需要采用自定义目录的方式避开Automake的两个隐含的限制:
- 如果使用bin_PROGRAMS, 则库文件会安装到bin目录下,这个不符合我们对动态库的要求;
- automake不允许用lib_PROGRAMS
也可以使用libtool来编译动态库。
5.4.4.2. libtool库
libtoolize 提供了一种标准的方式来将 libtool 支持加入一个软件包, 而 GNU libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中。
对于跨平台可移植的库来说,推荐使用libtool编译,而且Automake内置了libtool的支持,只需要将编译类型修改为_LTLIBRARIES即可,如下为一个Makefile.am的例子:
lib_LTLIBRARIES=libtest.lalibtest_la_SOURCES=test.c
这里 lib_LTLIBRARIES 的意思是生成的动态库,然后指定动态库依赖的源文件 test.c,若有多个源文件用空格隔开。
需要注意的是:如果要使用libtool编译,需要在configure.ac中添加LT_INIT宏,同时注释掉AC_PROG_RANLIB,因为使用了LT_INIT后,AC_PROG_RANLIB就没有作用了。 如果 autoreconf 无法识别 LT_INIT宏,你需要更新libtool或者在 configure.ac 里加上宏 AC_PROG_LIBTOOL ,表示利用 libtool 来自动生成动态库。 新工程中应该使用 LT_INIT 而不是使用 AC_PROG_LIBTOOL 。
5.4.5. 格式模板
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
Makefile.am还提供了一些全局变量供所有的目标体使用:
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
automake设置了默认的安装路径:
- 标准安装路径 默认安装路径为:$(prefix) = /usr/local,可以通过./configure –prefix=的方法来覆盖。 其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。
- 定义一个新的安装路径 比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1 test2,则test1,test2会作为数据文件安装到$(prefix)/ /test目录下。
5.5. 打包
Automake缺省情况下会自动打包,自动打包包含如下内容:
- 所有源文件
- 所有Makefile.am/Makefile.in文件
- configure读取的文件
- Makefile.am’s (using include) 和configure.ac’ (using m4_include)包含的文件
- 缺省的文件,例如README, ChangeLog, NEWS, AUTHORS
如果除了这些缺省的文件外,你还想将其它文件打包,有如下两种方法:
- 粗粒度方式:通过EXTRA_DIST来指定。 例如: EXTRA_DIST=conf/config.ini test/test.php tools/initialize.sh
- 细粒度方式:在“安装目录_编译类型=编译目标”前添加dist(表示需要打包), 或者nodist(不需要打包)。 例如: dist_data_DATA = distribute-this;nodist_foo_SOURCES = do-not-distribute.c
5.6. 一个例子
例子为一个简单但完整的项目,该项目只有test.c源代码文件,但使用了系统中使用pkg-config配置的dbus库。
代码目录如下:
ChangeLog configure.ac Makefile.am READMEAUTHORS COPYING INSTALL NEWSsrc: Makefile.am test.c
生成后并修改过的configure.ac文件:
dnl Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)AC_INIT(dbus-tutorial, 1.0)m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])AC_CANONICAL_SYSTEMAM_INIT_AUTOMAKE()AC_PROG_CCPKG_CHECK_MODULES(DBUS, dbus-1)PKG_CHECK_MODULES(GLIB, glib-2.0)PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1)CFLAGS="$CFLAGS -O0 $DBUS_CFLAGS $GLIB_CFLAGS -g -Wall -Werror"LDFLAGS="$LDFLAGS $DBUS_LIBS $GLIB_LIBS"AC_CONFIG_FILES(Makefile src/Makefile)AC_OUTPUT
主目录Makefile.am
SUBDIRS=src
代码目录Makefile.am,configure.ac中使用PKG_CHECK_MODULES定义了DBUS和GLIB及DBUS_GLIB前缀。
bin_PROGRAMS= testtest_SOURCES=test.ctest_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@test_LDADD = \ @GLIB_LIBS@ \ @DBUS_LIBS@ \ @DBUS_GLIB_LIBS@
5.7. 参考链接
- 大型项目使用Automake/Autoconf完成编译配置
- 大型项目使用Automake/Autoconf完成编译配置(2)
- Makefile.am详解
- 使用Automake生成Makefile及动态库和静态库的创建
- Autotools Mythbuster
- The PKG_CHECK_MODULES Macro
- 5. automake 和 autoconf 使用简明教程
- autoconf和automake的使用教程
- autoconf 和automake使用示例
- Autoconf和automake的使用
- AUTOCONF 和AUTOmake使用详解
- autoconf和automake的使用
- automake 和autoconf的使用
- 使用Automake和Autoconf生成Makefile
- autoconf和automake的安装与使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Linux系统--autoconf和automake的使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Linux下autoconf和automake使用
- Android之Service详解(二)
- Ehcache整合spring配置
- 1025. 反转链表 (25)
- 一篇很全的FreeMarker教程
- Canada Cup 2016 C 模拟
- 5. automake 和 autoconf 使用简明教程
- MeasureSpec学习(解决ScrollView中嵌套ListView,ListView只显示一行的问题)
- python pip设置代理
- android注释快捷键
- 使用 maven enforcer 插件检查依赖冲突
- android lint选项含义
- C++学习路线图
- Android抽象布局——include、merge 、ViewStub的区别
- Android init进程中鲜为人知的charger mode 模式