Chinaunix首页 | 论坛 | 博客
  • 博客访问: 786435
  • 博文数量: 129
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1329
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(129)

文章存档

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2011-11-22 08:02:20

http://qhwang.blogbus.com/logs/46084139.html

利用autoconf和automake等工具自动生成Makefile文件,基本步骤如下:

准备工程目录结构和程序
-执行autoscan 生成 configure.scan
- 编辑修改 configure.scan,重命名为 configure.ac 或 configure.in
- 依次执行aclocal; libtoolize; autoheader; autoconf 生成 'configure' 可执行文件
- 编写 Makefile.am
- 执行automake 生成 Makefile
- 完成。后面就可以 ./configure; make; make install; make dist; ...


下面首先以一个简单的例子来说明执行步骤(这里选helloworld程序)

进行之前,先安装相关程序,如果你是ubuntu系统,那么安装过程非常简单,只需执行几个命令就行

>sudo apt-get install autoconf

>sudo apt-get install automake

>sudo apt-get install libtool     (添加动态库需要用到)

新建一个目录:helloworld,进入该目录,新建helloworld.c文件,并添加如下内容:

#include

int main(int argc, char** argv)
{
     printf("Hello, Linux World!n");
     return 0;
}

然后执行autoscan命令

>autoscan

然后将生成的configure.scan文件改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:

AC_PREREQ([2.61])->AC_PREREQ(2.61)    //这个是标示版本,可以不修改,不影响

AC_INIT(...)->AC_INIT(hello, 1.0.0, gztt.ll@gmail.com) //定义生成可执行程序的名称,版本号以及bug提交地址

//如果需要调用静态库则添加AC_PROG_RANLIB,本例不需添加

//如果需要调用动态库则添加AC_PROG_LIBTOOL,本例不需添加

添加AM_INIT_AUTOMAKE(helloworld, 1.0)    //原文件没有,需自行添加

AC_OUTPUT->AC_OUTPUT(Makefile)  //定义在程序目录生成Makefile,如果需要生成多个Makefile也在此添加

修改保存后,执行aclocal,autoheader,autoconf命令

>aclocal

>autoheader

>autoconf

执行完后,在程序根目录下$(top_srcdir)新建Makefile.am,并编辑内容为:

AUTOMAKE_OPTIONS=foreign   //如果不加这句,则需要增加NEWS,ChangeLog,AUTHORS,README文件
bin_PROGRAMS=helloworld       //定义可执行程序,静态库用noinst_LIBRARIES,动态库用noinst_LTLIBRARIES
helloworld_SOURCES=helloworld.c  //多个文件在后面添加

保存推出,执行automake命令,automake会根据你写的Makefile.am来自动生成Makefile.in。 Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

>automake -a         //或者>automake --add-missing

完成生成Makefile,可以执行下列命令来测试

>make 根据Makefile编译源代码,连接,生成目标文件,可执行文件。

>make clean 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

>make install 将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

>make dist 产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似 “PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的 AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

>make distcheck 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
make distclean

类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。

 通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。如果你想写出更复杂的且符合惯例的 Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件。



阅读(1273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~