作为linux程序员,应该永远也离不开makefile文件。因为它给编译程序,尤其是大的项目带来的便利是不言而喻的。可是面对makefile那羞涩的规则,隐晦的变量,对于一个源文件多的工程,让程序员自己来写makefile那绝对是个头大的事情。可是我门又无法舍弃那只敲一个"make"就能编译出所要结果的快乐!所以GNU开发了一些非常好的工具,就是automake autoconf autoscan aclocal等工具。用它门可以自动生成工程的makefile.
下面我介绍以下他们的使用流程。这里有三个文件“mian.c”,"app.c","app.h".app.c包含函数的实现代码,app.h包含头文件,函数声明,main.c调用app.c里的函数。
因此他们的依赖关系为,main.c依赖app.c,app.h app.c依赖app.h.
main.c
#include "app.h"
int main(void)
{
int a,b,c;
init(&a,&b,&c);
if(a<b)
swap(&a,&b);
if(a<c)
swap(&a,&c);
if(b<c)
swap(&b,&c);
printf("排序之后 a=%d b=%d c=%d\n",a,b,c);
}
app.c
#include "app.h"
void swap(int *a,int *b)
{
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;
}
void init(int *a,int *b,int*c)
{
printf("请输入三个数\n");
scanf("%d %d %d",a,b,c);
}
app.h
#ifndef APP
#define APP
#include <stdio.h>
#include <stdlib.h>
void init(int *,int *,int *);
void swap(int *,int *);
#endif
现在我们先进入存放源文件的目录,
1.运行:autoscan
[zhangbenquan@zhangbenquan test]$ autoscan
[zhangbenquan@zhangbenquan test]$ ls
app.c app.h autoscan.log configure.scan main.c
运行生成了autoscan.log,configure.scan两个文件。这里我们只需要configure.scan 文件。
将他改名为configure.in
-*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.68]) //确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版
# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure。
AC_INIT(main, 1.0, 503927830@qq.com) 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址
AC_CONFIG_SRCDIR([app.c]) 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性
AC_CONFIG_HEADERS([config.h]) # 用于生成config.h文件,以便autoheader使用
AM_INIT_AUTOMAKE(main,1.0)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
修改AC_INIT里面的参数: AC_INIT(main,1.0, 503927830@qq.com)
添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
在AC_OUTPUT后添加输出文件Makefile
2: 运行aclocal
aclocal.m4 app.c app.h autom4te.cache autoscan.log configure.in main.c
生成aclocal.m4 ,autom4te.cache
3:运行autoconf
4: 运行autoheader ,生成config.h.in
5:创建Makefile.am文件
内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main /要生成的最终程序名称
main_SOURCES=main.c app.c app.h main
”这个执行程序所需要的原始文件。如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的 所有原 始文件都列出来,并用空格隔开。例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
6:运行:automake --add-missing
7: ./configure
8:make
9./main
[zhangbenquan@zhangbenquan test]$ ./main
请输入三个数