当多个源文件存在依赖关系时,在linux下我们通常会写一个Makefile.但要写一个规范的符合gnu规则的Makefile并不容易,幸亏有automake和autoconf这两个工具.嘿嘿!就让我们开始吧
以下以三个文件file1.c file2.c file2.h为例子讲解linux下Makefile的自动生成过程.
file1.c
[root@localhost temp]# cat file1.c
#include <stdio.h>
#include "file2.h"
int main(void)
{
printf("print file1$$$$$$$$$$$4\n");
file2print();
return 0;
}
file2.c
[root@localhost temp]# cat file2.c
#include <stdio.h>
#include "file2.h"
void file2print()
{
printf("print file2************************\n");
}
file2.h
[root@localhost temp]# cat file2.h
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern "C"
{
#endif
void file2print();
#ifdef __cplusplus
}
#endif
#endif
第一步:安装automake和autoconf这两个工具.yum install automake ;yum install autoconf.
第二布:将三个源文件放到一个工程目录(以/helloworld为例)进入目录中执行autoscan命令.会生成一个autoscanf.log 和configure.scan;
第三步:将configure.scan 改名为configure.in(configure.scan 是configure.in的原型文件,configure.in 是autoconf的脚本配置文件.在下面我们会用到)
[root@localhost temp]# cat configure.in
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(helloworld, 1.0) #工程名字和版本号,一个bug-report-address省略了
AM_INIT_AUTOMAKE(helloworld,1.0) #工程名字和版本号,这一行要手动添加哦!!!!
AC_CONFIG_SRCDIR([file2.h]) #一般不用修改,用来检测源码文件是否存在,确认目录的有效性
AM_CONFIG_HEADER([config.h]) #用于生成config.h以便下面的autoheader使用.
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile) #定义输出为Makefile.
第四步:执行aclocal,autoconf,autoheader注意顺序
第五步:执行automake --add-missing.在执行之前要自己创建一个脚本配置文件Makefile.am.--add-missing此参数会添加一些必要的脚本文件.
[root@localhost temp]# cat Makefile.am
AUTOMAKE_OPTIONS=foreign #有三个参数foreign,gnu,gnits默认gnu.使用foreign只是检查必要的文件而已.
bin_PROGRAMS=helloworld #的可执行程序(工程名)
helloworld_SOURCES=file1.c file2.c file2.h #程序所依赖的文件
第六步:执行./configure命令生成Makefile
以上六步之后Makefile就建好了,以后你就可以用make;make install;make uninstall;make clean;make distclean;make dist这些命令来对这个工程操作.
在任何路径下运行./helloworld都能实现.实际上已经是一个软件了.你可以用make dist来打包你的软件分发给你的同学.很过瘾吧!!
|