使用autoconf和automake创建小项目

用了两天将之前的Snake游戏重新组织了一下,使用autoconf和automake按照GNU的安装软件组织布局重新编译并测试安装通过,第一次做这样的事情,很多知识查了很多资料才弄明白,最后克服了困难,可以把snakes安装到电脑上了。下面就描述一下,希望能帮到其他新手。

工程的文件组织如下:

有了这些源文件后,若希望使用autoconf,和automake的话,我们就需要一些Makefile.am和一个configure.ac文件,configure文件其实不用我们亲自去写,只需要执行autoscan后就会生成一个configure.ac的模版文件configure.scan的文件,这个文件与configure已经相差不多了,我们只需要修改个别几处就可以了。

AC_PREREQ([2.68])
AC_INIT(snakes,1.0, lmdyyh@163.com)
AM_INIT_AUTOMAKE(snakes,1.0,lmdyyh@163.com)
AC_CONFIG_SRCDIR([src/snake/mainSnake.cpp]) //主文件
AC_CONFIG_HEADERS([src/config.h])  //修改以上几行即可

# Checks for programs.
AC_PROG_CXX  //C++编译器
#AC_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
#AC_PROG_MAKE_SET
LT_INIT  //替换AC_PROG_RANLIB
AC_PROG_LIBTOOL  //若用到动态库
AC_CONFIG_MACRO_DIR([m4]) //根据后面执行aclocal的警告自己后加的

AC_OUTPUT([Makefile
                 src/Makefile
         src/base64/Makefile
                 src/color/Makefile
                 src/food/Makefile
                 src/music/Makefile
                 src/snake/Makefile
                 src/timer/Makefile
         src/res/Makefile
         lib/Makefile
         src/xml/Makefile])
生成configure.scan并修改后就可以把configure.scan文件名改成configure.ac。上面的AC_OUTPUT很重要,这告诉configure你希望再哪些目录下生成Makefile文件,若想生成Makefile就需要再相应的目录下自己编写一个Makefile.am的文件。当我们有了configure.ac后执行aclocal会生成aclocal.m4的文件,aclocal是一个perl文件,m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。如果有动态库生成则需要执行libtoolize,然后再执行autoheader生成config.h.in文件,这样后就可以使用autoconf来生成configure配置脚本了。

小结一下,完成上面的工作依次执行

aclocal
libtoolize
autoheader
autoconf

生成configure文件就行了。

下面就说一下在各个目录下如何编写Makefile.am文件了。首先主目录之需列出次级目录即可

Snake2/Makefile.am的内容

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src lib
include因为无需操作所以不需要列出。SUBDIRS是automake已定义的变量。下面就是src下的Makefile.am及其子目录的Makefile.am的编写了。

Snake2/src/Makefile.am

INCLUDES=-I$(top_srcdir)/include -I$(top_srcdir)/include/libxml
SUBDIRS = res base64 xml color food music timer snake

INCLUDES是automake中已有的变量,主要包含头文件的目录。

noinst_LIBRARIES=libcolor.a
libcolor_a_SOURCES=Color.cpp
INCLUDES=-I$(top_srcdir)/include

Makefile.am和Makefile的区别就是,Makefile.am中需要有前缀,noinst代表这个静态库在程序安装的时候不会被安装到系统,之所以用静态库是因为Makefile.am不允许生成.o结尾的文件,所以这里就只能生成静态库。所有被程序需要的.o文件都生成.a的静态文件或者.la的动态文件,我这里没有用到生成.la的文件。下面music,food,xml,timer,base64的Makefile.am都于此类型,仿照着写就行了。下面看一下生成可执行文件的Makefile.am的书写方式:

bin_PROGRAMS=snakes
snakes_SOURCES=mainSnake.cpp Snake.cpp Snake.h
INCLUDES=-I$(top_srcdir)/include -g
LIBS=-lIrrKlang -lncurses -lpthread -lxml2 -ltinfo -L$(top_srcdir)/lib
snakes_LDADD=$(top_srcdir)/src/color/libcolor.a $(top_srcdir)/src/music/libmusic.a $(top_srcdir)/src/food/libfood.a $(top_srcdir)/src/xml/libxmlStore.a $(top_srcdir)/src/timer/libtimer.a $(top_srcdir)/src/base64/libbase64.a
以bin前缀代表需要生成可执行的文件,$(top_srcdir)代表顶层目录,这里即表示Snake2,LIBS代表包含链接选项,应为我这里需要用到几个已有的动态库(.so),所以需要告诉链接器需要链接哪些动态库及到哪里可以找到。LDADD后面定义要用到的静态库,这里就是上面各个子文件里生成的静态文件了。

如果你的可执行文件需要其他文件作文输入,或者输出其他文件,那么需要像下面这样定义res下的Makefile.am

resdir=/tmp/res
res_DATA=food_eat.ogg

res说明你想在/tmp下生成res子目录,DATA表明food_eat.ogg在安装程序的时候拷贝到/tmp/res中。

在所有的Makefile.am都准备好了就可以准备生成Makefile.in文件,执行automake --add-missing,这样有了Makefile.in就可以使用./configure来生成Makefile文件了,生成后就剩make和make install了。

所以上面依次需要执行:

automake --add-missing
./configure
make
make install (root)

即可,由于符合GNU标准的工程还需要NEW,AUTHOUR,等文件,当程序提示你没有这些文件的时候你只需touch NEW就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值