我打算 编译一个.c程序为.o 所以想make一下。这样就想写一个makefile,从网上找到一篇(运用
autoconf和automake自动生成Makefile实例讲解)的文章。上面是这么说的:
1、进入hello目录,运行autoscan命令,命令如下:
cd hello
autoscan
2、ls会发现多了一个configure.scan文件。修改此文件,在AC_INIT宏之后加入AM_INIT_AUTOMAKE(hello, 1.0),这里hello是你的软件名称,1.0是版本号,即你的这些源程序编译将生成一个软件hello-1.0版。然后把 configure.scan文件的最后一行AC_OUTPUT宏填写完整变成AC_OUTPUT(Makefile),表明autoconf和 automake最终将生成Makefile文件。最后把configure.scan文件改名为configure.in。最终 configure.in文件内容如下:
dnl Process this file with autoconf to produce a configure script.
AC_INIT(target.c)
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)
3、运行aclocal命令,ls会发现多了一个aclocal.m4文件。
4、然后运行autoconf命令,ls将发现生成了一个可执行的configure命令。
5、编辑一个Makefile.am文件,文件内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_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.c interface/interface.h
这表明你最后将通过一个make命令利用上述hello_SOURCES源文件生成一个hello的程序。
6、运行automake --add-missing命令。屏幕提示如下:
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'
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里的任何字符。
我在进行第一步时,出现如下提示:
autom4te:configure.ac: no such file or directory
autoscan:/usr/local/bin/autom4to failed witn exit status: 1
下面的几步都没有什么问题,直到第6步,出现了下面的情况
configure.in:installing './install-sh'
configure.in:installing './missing'
configure.in:8:required file 'config .h.in ' not found
我认为可能没有指明,需要源文件的路径于是加了:
(1)VPATH=\xu\kernel\hfrk\linux-2.6.14
(2)vpath %.h \xu\kernel\hfrk\linux-2.6.14\include\asm
vpath %.h \xu\kernel\hfrk\linux-2.6.14\include\asm\arch
vpath %.h \xu\kernel\hfrk\linux-2.6.14\include\linux
1与2个用一次,一起用一次。但是仍然没效果,其中一起用时。出现下面情况:
configure.in:8:required file 'config .h.in ' not found 就这一句


qidong 于 2007-08-01 10:46:24发表:
我的Makefile.am是这么写的:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=LED
LED_SOURCES=shouji/*.h shouji2/*.h shouji3/*.h
因为文件比较多 所以我用*想省点事,难道这样不可以么。是因为 这个出了问题么
qidong 于 2007-07-31 21:56:58发表:
师兄,小弟确实是不才阿。又遇到了问题,现说明情况如下:
我用编写的makefile,make结果出现
make all-am
make[1]: Entering directory `/xu/xu.qu1'
gcc -g -O2 -o LED
gcc: 没有输入文件
make[1]: *** [LED] 错误 1
make[1]: Leaving directory `/xu/xu.qu1'
make: *** [all] 错误 2
我觉得是我的gcc不好么,就记得我的开发板上好像有配套的。就将其考到PC机上。并将gcc=/xu/cross/2.95.3/bin/arm-linux-gcc,然后再make。出现:
make all-am
make[1]: Entering directory `/xu/xu.qu1'
/xu/cross/2.95.3/bin/arm-linux-gcc -g -O2 -o LED
arm-linux-gcc: No input files
make[1]: *** [LED] 错误 1
make[1]: Leaving directory `/xu/xu.qu1'
make: *** [all] 错误 2
为什么会这样呢,希望各位大侠有空的话能指点一二 。非常感谢。
qidong 于 2007-07-27 18:09:23发表:
感谢deepwhite师兄的指点,我在automake之前输入autoheader,果然创建了。感谢 师兄,百忙之中能够 指点迷津。并屈尊回答这种小菜菜的问题。
另外,对karon_fedora师兄的再次留言同样非常感激 。不过,本人比较菜。还没弄明白师兄什么意思。但是,仍然感激。
karon_fedora 于 2007-07-26 19:01:51发表:
没有系统日志.....?
厄~~~~~~~~~~~~~~~
deepwhite 于 2007-07-25 19:09:18发表:
我的意思是在执行automake以前先执行一下autoheader,然后在使用automake生成Makefile。因为在Makefile的生成过程中需要config.h.in,而config.h.in又需要用autoheader来生成。他们之间有依赖关系。
所以先autoheader,然后在automake,才可以生成Makefile。
qidong 于 2007-07-25 10:55:34发表:
感谢两位师兄,百忙之中为我指点迷津。本人学习遇到问题感到步履维艰,感谢大家的帮助。
对于第一位师兄的建议,我试了一下。在/var/log/下没有message这个文件。在当前文件夹下也没有configure.in这个文件,有两个文件autoscan.lon和configure.scan。但是我觉得参考教程的第二步是不是在当前文件夹下将configure.scan改称了congigure.in。
对于第二位师兄的建议,我打算准备好了再试。因为我在进行到第5步时,突然发现我实际上在用一个类似函数库一样的大文件夹。我的7个源文件中还包含其它的别的文件,他们有些环环相扣我还没有弄清楚所有的路径。
我在想能不能,制定个路径让make自己去找。而且最好能用到automake,因为我还要指望他帮我生成makefile文件。
再次感谢各位的指点,谢谢。
deepwhite 于 2007-07-24 22:34:59发表:
config.h.in不是通过路径设置的,而是由软件自动生成的。
在运行automake以前先运行autoheader来生成config.h.in。
建议你把Makefile的生成过程中文件的依赖关系好好看一下。
karon_fedora 于 2007-07-24 22:27:52发表:
第一步的时候 autoscan应该是用来生成configure.in的东西
那么如果他失败
后面就应该是错的
执行第一步之后
tail /var/log/message
看看显示的是什么