automake的使用和注意事项(错误分析)

来源:互联网 发布:淘宝推广方式论文 编辑:程序博客网 时间:2024/06/07 14:40

今天下午搞了一个下午,终于算是会用一点automake了,在这里写下来,防止以后犯下同样的错误。

先贴一篇别人写的使用步骤,我是按照这个步骤来的,但是却出现了不少意想不到的错误啊!

这篇文章大部分是从网上找到了,但是原作者在几个关键的点上(可能是菜鸟才会犯的错误吧大哭),没有指出来,我这篇文章,算一个补充吧!

我在下面标出了最容易出错的地方,希望后来的人少走点弯路啊,也给自己做个备忘!

======================准备工作=================================

在开始使用autoconf和automake之前,首先确认你的系统安装有GNU的如下软件:
1. automake
2. autoconf
3. m4
4. perl
5. 如果你需要产生共享库(shared library)则还需要GNU Libtool

介绍方法之前大家看一下下面这个图,先记下autoconf和automake工作的几个步骤:

=====================步骤简介================================

步骤解释如下:
1、由你的源文件通过autoscan命令生成configure.scan文件,然后修改configure.scan文件并重命名为configure.in
2、由aclocal命令生成aclocal.m4
3、由autoconf命令生成configure
4、编辑一个Makefile.am文件并由automake命令生成Makefile.in文件
5、运行configure命令生成Makefile

===================实例==================================

例子源程序结构如下:
hello是我们的工作目录,hello目录下有main.c源文件和comm、tools、db、network、interface等五个目录。

comm目录下有comm.c和comm.h源文件及头文件,tools目录下有tools.c和tools.h,同样其它目录分别有db.c、 db.h、network.c、network.h、
interface.c、interface.h等一些源文件。

按照如下步骤来自动生成Makefile吧:

1、

进入hello目录,运行autoscan命令,命令如下:
>cd hello
>autoscan

2、这步很重要 configure.in 主要是用来检测系统的环境

ls会发现多了一个configure.scan文件。修改此文件,

在AC_INIT宏之后加入  
AM_INIT_AUTOMAKE (hello, 1.0,lvhongya2008@126.com),
这里hello是你的软件名称,1.0是版本号,第三个是联系方式

即你的这些 源程序编译将生成一个软件hello-1.0版。

然后把 configure.scan文件的最后一行
AC_OUTPUT宏填写完整变成AC_OUTPUT(Makefile),这个不一定非要这样写,还有一种是这个样子

AC_CONFIG_FILES([Makefile])

AC_OUTPUT

但是AC_OUTPUT这个宏也是必须的

表明autoconf和 automake最终将生成
Makefile文件。最后把configure.scan文件改名为configure.in。最终 configure.in文件
内容如下:

#dnl Process this file with autoconf to produce a configure script.AC_INIT(hello, 1.0,lvhongya2008@126.com)  #这个宏是必须的AM_INIT_AUTOMAKE(hello, 1.0)              #一定注意这个顺序不能变啊#dnl Checks for programs.AC_PROG_CC#dnl Checks for libraries.#dnl Checks for header files.#dnl Checks for typedefs, structures, and compiler characteristics.#dnl Checks for library functions.AC_OUTPUT(Makefile) #还有一种是这个样子#AC_CONFIG_FILES([Makefile])#AC_OUTPUT

 如果上面红色字体部分的顺序改变的话(我就这样搞了一个下午)

就会在生成的configure中出现大量的错误提示:主要是说以as_fn_开头的大量的命令未找到,看的我心拔凉啊!

 3、>aclocal

        会发现多了一个aclocal.m4文件。
4、>autoconf

        将发现生成了一个可执行的configure命令。
5、Makefile.am 主要是用来确定你自己程序的依赖关系

编辑一个Makefile.am文件,文件内容如下:

AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=hellohello_SOURCES=main.c comm/comm.c comm/comm.h tools/tools.c tools/tools.h db/db.c db/db.h network/network.c network/network.h interface/interface.cinterface/interface.h #这里的_SOURCES 是关键字 ,源文件列表可以通过find命令自己生成#hello_LDADD =  #可执行文件main连接时需要的库文件(.so .a)#hello_LDFLAGS = -lpthread  #这个是依赖的系统库#AM_CFLAGS=-D_LINUX #传递给编译器 预编译宏,和选项#INCLUDES=-I/usr/include/ # 传递给编译器的头文件路径。

这表明你最后将通过一个make命令利用上述hello_SOURCES源文件生成一个hello的程序

6、>automake --add-missing

屏幕提示如下:
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'

在这个地方有可能会提示config.h.in未找到,先运行一下autoheader,再运行automake --add-missing 就OK了。

如果你用的是windows+vmware,还有可能出这个错http://blog.csdn.net/lvhongya/article/details/6612170

7、

        然后你可以运行之前生成的configure命令来生成一个Makefile文件,输入./configure命令即可。
8、

编辑Makefile文件,找到$(LINK)所在的那一行,本来生成的文件内容如下:
@rm -f hello
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
在这两行之间增加几行变成:
@rm -f hello
@mv -f comm.o comm
@mv -f tools.o tools
@mv -f db.o db
@mv -f network.o network
@mv -f interface.o interface
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
这是因为默认生成的Makefile将在编译后把所有目标文件置于当前目录,而在进行链接
(link)时又会到各个子目录去找相应的目标文件。
当然,为了完整,建议各位在clean部分加上如下一些行:
@rm -f comm/comm.o
@rm -f tools/tools.o
@rm -f db/db.o
@rm -f network/network.o
@rm -f interface/interface.o

好了,经过上述这些步骤后,现在你可以来编译生成你自己的可执行程序了。输入一个make
 all吧,然后就可以运行./hello来看你的程序运行了。

运用autoconf和automake的最大好处是,你的程序以源程序方式发布后,其它所有人只需要
依次输入
./configure
make
make install
命令就可以把你的程序安装在自己的电脑上运行了。所有符合GNU标准的UNIX/Linux都不需
要再修改Makefile里的任何字符。

原文地址:http://www.newsmth.net/pc/pccon.php?id=6109&nid=200148-


 

 

原创粉丝点击