关于Makefile,Makefile.in,Makefile.am的问题

转载 2011年01月23日 15:18:00

最近在研究开源的东西,发现有很多makefile.am,makefile.in,makefile文件,它们之间究竟是什么关系呢?能可以用什么工具生成吗?

 
   无论对于一个初学者还是一个资深的Linux程序员,编写Makefile文件都是一件很麻烦的事;再者,开发人员应该把主要的精力放在程序代码的编写上,而在Makefile文件花费太多的精力显然是不明智的;还有,对于不同的处理器架构,往往编译器不同,环境不同,特别是一些嵌入式系统中的各种程序的编译,于是移植问题也使Makefile文件编写趋于复杂,也显得这个问题很重要。对于这些问题Linux的高手们早已想到了,所以他们开发了一些能够自动生成Makefile文件的工具。他们就是下面这些工具:
〉GNU Automake
〉GNU Autoconf
〉GNU m4
〉perl
〉GNU Libtool
因此您的操作系统必须安装以上软件,否则就不能够自动生成Makefile文件或者在生成的过程中出现各种各样的问题。用 autoconf/automake/autoheader工具来处理各种移植性的问题,用这些工具完成系统配置信息的收集,制作Makefile文件。然后在打算编译源码时只需要通过 "./configure; make"这样简单的命令就可以得到干净利落的编译。

制作Makefile文件需要以下几步:
1〉建立编译目录和源代码目录及源代码文件(即要编译的源文件)
[root@localhost leaf]#mkdir testmk
[root@localhost leaf]#cd testmk
[root@localhost testmk]#vi hello.c
编辑hello.c文件如下内容:
/*filename:hello.c*/
#include <stdio.h>

int main(int argc,char **argv)
{
printf("%s/n","Hello, World!")
return 0;
}
2〉利用autoscan工具产生一个configure.in文件的模板文件configure.scan文件:
[root@localhost testmk]#autoscan
[root@localhost testmk]#ls
configure.scan hello.c
3〉把configure.scan文件更名为configure.in文件,并编译其内容如下:
[root@localhost testmk]#mv configure.scan configure.in
[root@localhost testmk]#vi configure.in
dnl Process this file with autoconf to produce a configure script.
AC_INIT(hello.c)

dnl Add the file by leaf
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)

4〉执行aclocal,会产生aclocal.m4文件
[root@localhost testmk]#aclocal
[root@localhost testmk]#ls
aclocal.m4 configure.in hello.c
5〉执行autoconf,会产生confiure文件
[root@localhost testmk]#autoconf
[root@localhost testmk]#ls
aclocal.m4 [autom4te.cache] configure configure.in hello.c
6〉创建文件Makefile.am并编辑其内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
其中,hello为编译后产生的可执行文件名称,而第三行等号后面为源文件列表
7〉执行automake程序,automake程序会根据Makefile.am产生一些文件,其中最重要的是Makefile.in文件:
[root@localhost testmk]#automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'
[root@localhost testmk]#ls
aclocal.m4 [autom4te.cache] configure configure.in depcomp
hello.c install-sh Makefile.am Makefile.in missing
mkinstalldirs
8〉执行configure脚本,生成我们需要的Makefile文件。
[root@localhost testmk]#./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
9〉最后只执行make就大功告成了:
[root@localhost testmk]#make
source='hello.c' object='hello.o' libtool=no /
depfile='.deps/hello.Po' tmpdepfile='.deps/hello.TPo' /
depmode=gcc3 /bin/sh ./depcomp /
gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. -I. -g -O2 -c `test -f 'hello.c' || echo './'`hello.c
gcc -g -O2 -o hello hello.o

备注:
1.以上内容均在RedHat Linux 9.0环境下测试通过。
2.参考书目《Linux 程序设计权威指南》于明俭、陈向阳、方汉编著
3.其它国内外网站资料
4.RedHat 9.0下带的程序文件及版本
autoconf-2.57-3.noarch.rpm
automake-1.6.3-5.noarch.rpm
gcc-3.2.2-5.i386.rpm

Makefile.am, Makefile.in 与 Makefile的关系

Makefile.am, Makefile.in 与 Makefile的关系
  • ixidof
  • ixidof
  • 2010年08月24日 00:00
  • 15041

Makefile.am、Makefile.in和Makefile的关系

它们这三个东东是怎么来的呢? Makefile.am: 是一些编译的选项及要进行编译的文件项等,例如: bin_PROGRAMS=test lib_LIBRARIES = libhand.a l...
  • yygydjkthh
  • yygydjkthh
  • 2015年01月30日 22:39
  • 5440

Makefile学习笔记

主要参考文档:《跟我一起写makefile》,这里有一篇《谈谈职业规划——CSDN对陈皓的采访》,被采访的大牛就是这个文档的作者,他的CSDN专栏。本文的示例工程及Makefile 在这里 一、...
  • yasi_xi
  • yasi_xi
  • 2012年10月15日 14:13
  • 11369

Makefile Makefile.am Makefile.in

Makefile Makefile.am Makefile.in2010-07-19 17:41自动生成Makefile的全过程详解!automake/autoconf入门automake/autoc...
  • OLillian
  • OLillian
  • 2011年03月27日 10:00
  • 2884

Makefile.am和makefile.in生成Makefile

Makefile.am和makefile.in生成Makefile
  • qq_19876131
  • qq_19876131
  • 2016年04月06日 22:05
  • 4592

Windows平台下Makefile学习笔记(一)

作者:朱金灿来源:http://blog.csdn.net/clever101         决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用...
  • clever101
  • clever101
  • 2012年11月05日 09:02
  • 42431

Makefile.am文件的实例讲解

Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候...
  • zmxiangde_88
  • zmxiangde_88
  • 2012年09月27日 11:22
  • 37193

编写Makefile.am

Makefile.am将指明工程需要哪些源文件,建造的是什么,如何安装它们。 具体语法如下: option_where_PRIMARY = targets … targets是要建造的目标 P...
  • john_crash
  • john_crash
  • 2015年11月17日 22:57
  • 1561

Makefile.am文件详解

Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候...
  • u013485792
  • u013485792
  • 2016年05月09日 20:02
  • 1953

Makefile.am 语法

Makefile.am,是一个文件也好,是一种技术也罢,其它文件里面写的东西很简单,但是你要按照规则去写,就像Makefile文件一样,所以不要觉得Makefile.am文件很神秘,它和Makefil...
  • vevenlcf
  • vevenlcf
  • 2015年08月31日 15:12
  • 4982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Makefile,Makefile.in,Makefile.am的问题
举报原因:
原因补充:

(最多只允许输入30个字)