[ZLG-ARM] 用autotools制作Makefile 和configure文件(转)

[复制链接]
 楼主| billen 发表于 2009-6-4 17:02 | 显示全部楼层 |阅读模式
目的从复杂的工作中简化出来。&nbsp;<br />网上有一些制作Makfile的**,只停留在Makefile而已。用autotools的工具相对来说要简单的多,其它一些介绍autotools**又有很多漏洞,而且步骤烦琐。<br /><br />制作一个最简单的helloworld程序:&nbsp;<br />现有目录test&nbsp;<br />mkdir&nbsp;src&nbsp;建立src目录存放&nbsp;源代码&nbsp;<br />在src下。&nbsp;<br />编辑hello.c文件&nbsp;<br /><br /><br />代码:<br />&nbsp;#include&nbsp;&ltstdio.h&gt&nbsp;int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('hello&nbsp;world');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;}&nbsp;<br /><br />在src目录下建立Makefile.am文件&nbsp;(src/Makefile.am)&nbsp;<br /><br /><br />代码:<br />&nbsp;AUTOMAKE_OPTIONS=foreign&nbsp;bin_PROGRAMS&nbsp;=&nbsp;hello&nbsp;hello_SOURCES&nbsp;=&nbsp;hello.c&nbsp;hello_LDADD&nbsp;=&nbsp;-lpthread&nbsp;(只是测试,实际不需要连接该库)&nbsp;<br /><br />保存退出&nbsp;<br />退到test目录&nbsp;&nbsp;<br />编辑Makefile.am文件&nbsp;(Makefile.am)&nbsp;<br />SUBDIRS&nbsp;=&nbsp;src&nbsp;<br />退出保存&nbsp;<br />然后&nbsp;<br />执行&nbsp;&nbsp;<br />autoscan&nbsp;<br />生成configure.scan文件&nbsp;<br />按此编辑此文件&nbsp;<br /><br /><br />代码:<br />&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-*-&nbsp;Autoconf&nbsp;-*-&nbsp;#&nbsp;Process&nbsp;this&nbsp;file&nbsp;with&nbsp;autoconf&nbsp;to&nbsp;produce&nbsp;a&nbsp;configure&nbsp;script.&nbsp;AC_PREREQ(2.59)&nbsp;AC_INIT(hello,1.0,&nbsp;[miaoquan@nou.com.cn])&nbsp;AM_INIT_AUTOMAKE&nbsp;AC_CONFIG_SRCDIR([src/hello.c])&nbsp;AC_CONFIG_HEADER([config.h])&nbsp;#&nbsp;Checks&nbsp;for&nbsp;programs.&nbsp;AC_PROG_CC&nbsp;#&nbsp;Checks&nbsp;for&nbsp;libraries.&nbsp;#&nbsp;FIXME:&nbsp;Replace&nbsp;`main'&nbsp;with&nbsp;a&nbsp;function&nbsp;in&nbsp;`-lpthread':&nbsp;AC_CHECK_LIB([pthread],&nbsp;[main])&nbsp;#&nbsp;Checks&nbsp;for&nbsp;header&nbsp;files.&nbsp;#&nbsp;Checks&nbsp;for&nbsp;typedefs,&nbsp;structures,&nbsp;and&nbsp;compiler&nbsp;characteristics.&nbsp;#&nbsp;Checks&nbsp;for&nbsp;library&nbsp;functions.&nbsp;#AC_CONFIG_FILES([Makefile&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src/Makefile])&nbsp;AC_OUTPUT(Makefile&nbsp;src/Makefile)&nbsp;<br /><br />退出保存&nbsp;<br />将此文件更名&nbsp;mv&nbsp;configure.scan&nbsp;configure.in&nbsp;<br />然后执行&nbsp;<br />touch&nbsp;NEWS&nbsp;README&nbsp;AUTHORS&nbsp;ChangeLog&nbsp;<br />然后执行&nbsp;<br />autoreconf&nbsp;-fvi&nbsp;<br />至此生成configure文件&nbsp;<br />执行configure文件&nbsp;<br />生成Makefile文件&nbsp;<br />make&nbsp;&nbsp;<br />make&nbsp;install&nbsp;<br />make&nbsp;uninstall&nbsp;<br />make&nbsp;dist&nbsp;&nbsp;<br />试验一下吧。<br />继续完善这个例子,论坛里有人问,如何生成静态库,并连接.&nbsp;<br />完善hello.c这个例子&nbsp;<br /><br />当前目录&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;src&nbsp;目录&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;hello.c&nbsp;文件&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;include&nbsp;目录&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;hello.h文件&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;lib&nbsp;目录&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;&nbsp;test.c文件&nbsp;此文件用来生成&nbsp;libhello.a&nbsp;<br />在当前目录&nbsp;编写Makefile.am&nbsp;<br /><br /><br />代码:<br />&nbsp;SUBDIRS&nbsp;=&nbsp;lib&nbsp;src&nbsp;<br /><br />在include目录下&nbsp;编写hello.h&nbsp;<br /><br /><br />代码:<br />&nbsp;extern&nbsp;void&nbsp;print(char&nbsp;*);&nbsp;<br /><br />在lib目录下编写test.c&nbsp;<br /><br /><br />代码:<br />&nbsp;#include&nbsp;&ltstdio.h&gt&nbsp;void&nbsp;print(char&nbsp;*msg)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('%s',msg);&nbsp;}&nbsp;<br /><br />在lib目录下编写Makefile.am&nbsp;<br /><br /><br />代码:<br />&nbsp;noinst_LIBRARIES=libhello.a&nbsp;libhello_a_SOURCES=test.c&nbsp;<br /><br />这里noinst_LIBRARIES&nbsp;的意思是生成的静态库&nbsp;,不会被make&nbsp;install&nbsp;安装&nbsp;<br />然后指定libhello.a的源文件test.c&nbsp;<br /><br />在src目录下编写hello.c&nbsp;<br /><br /><br />代码:<br />&nbsp;#include&nbsp;'hello.h'&nbsp;int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print('haha');&nbsp;&nbsp;//这里是静态库里的print函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;}&nbsp;<br /><br />在src目录下编写Makefile.am&nbsp;<br /><br /><br />代码:<br />&nbsp;INCLUDES=&nbsp;-I../include&nbsp;bin_PROGRAMS=hello&nbsp;hello_SOURCES=hello.c&nbsp;hello_LDADD=../lib/libhello.a&nbsp;<br /><br />首先指定头文件的位置&nbsp;../include&nbsp;<br />然后指定要生成执行文件&nbsp;hello&nbsp;<br />然后指定源代码文件&nbsp;hello.c&nbsp;<br />最后添加静态库的位置&nbsp;../lib/libhello.a&nbsp;<br /><br />按照我首篇帖子的方式.&nbsp;<br />执行autoscan&nbsp;生成configure.scan&nbsp;<br />修改该文件&nbsp;<br />按照首篇帖子修改.&nbsp;<br />然后不同之处&nbsp;<br />需要添加一行:AC_PROG_RANLIB&nbsp;<br /><br /><br /><br />代码:<br />&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-*-&nbsp;Autoconf&nbsp;-*-&nbsp;#&nbsp;Process&nbsp;this&nbsp;file&nbsp;with&nbsp;autoconf&nbsp;to&nbsp;produce&nbsp;a&nbsp;configure&nbsp;script.&nbsp;AC_PREREQ(2.59)&nbsp;AC_INIT(hello,1.1,[miaoquan@nou.com.cn])&nbsp;AM_INIT_AUTOMAKE&nbsp;AC_CONFIG_SRCDIR([src/hello.c])&nbsp;AC_CONFIG_HEADER([config.h])&nbsp;#&nbsp;Checks&nbsp;for&nbsp;programs.&nbsp;AC_PROG_CC&nbsp;#&nbsp;Checks&nbsp;for&nbsp;libraries.&nbsp;AC_PROG_RANLIB&nbsp;#&nbsp;Checks&nbsp;for&nbsp;header&nbsp;files.&nbsp;#&nbsp;Checks&nbsp;for&nbsp;typedefs,&nbsp;structures,&nbsp;and&nbsp;compiler&nbsp;characteristics.&nbsp;#&nbsp;Checks&nbsp;for&nbsp;library&nbsp;functions.&nbsp;#AC_CONFIG_FILES([Makefile&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib/Makefile&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src/Makefile])&nbsp;AC_OUTPUT([Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib/Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src/Makefile])&nbsp;<br /><br />mv&nbsp;configure.scan&nbsp;configure.in&nbsp;<br /><br />touch&nbsp;NEWS&nbsp;README&nbsp;AUTHORS&nbsp;ChangeLog&nbsp;<br /><br />执行autoreconf&nbsp;-fvi&nbsp;<br />生成configure.执行configure生成Makefile<br />后面同上...<br />
armpc 发表于 2009-6-4 17:10 | 显示全部楼层

顶一个

  
lpc2410 发表于 2009-7-3 13:09 | 显示全部楼层

不错

  
armqt 发表于 2009-7-3 13:25 | 显示全部楼层

不错

  
qtopia 发表于 2009-7-4 12:51 | 显示全部楼层

经典

  
chun1chun 发表于 2009-7-18 13:38 | 显示全部楼层

比較深入了

  
armqt 发表于 2009-7-24 17:33 | 显示全部楼层

这个没有弄过

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部