相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用。很多GNULinux的的软件都是用它生成Makefile的,包括我们非常熟悉的Linux内核源代码。

1、准备:

需要工具

autoscan

aclocal

autoheader

automake

autoconf

auto make

在终端敲入命令,哪个没有安装哪个,一般是第一个autoscan没有,其它的我用的Ubuntu10.04下全部都有

2、测试程序编写:
     建立目录:mkdir include src

编写程序:include/str.h

  1. #include <stdio.h>
  2. int str(char *string);

编写程序:src/str.c

  1. #include "str.h"
  2. //print string
  3. int str(char *string){
  4. printf("\n----PRINT STRING----\n\"%s\"\n",string);
  5. return 0;
  6. }
  7. //interface of this program
  8. int main(int argc , char **argv){
  9. char str_read[1024];
  10. printf("Please INPUT something end by [ENTER]\n");
  11. scanf("%s",str_read);
  12. return str(str_read );
  13. }

3、生成configure.ac

configure.ac是automake的输入文件,所以必须先生成该文件。
    执行命令:

  1. [root@localhost str]# ls
  2. include  src
  3. [root@localhost str]# autoscan
  4. autom4te: configure.ac: no such file or directory
  5. autoscan: /usr/bin/autom4te failed with exit status: 1
  6. [root@localhost str]# ls
  7. autoscan.log  configure.scan  include  src
  8. [root@localhost str]# cp configure.scan configure.ac

修改 configure.ac

  1. #                                               -*- Autoconf -*-
  2. # Process this file with autoconf to produce a configure script.
  3. AC_PREREQ(2.59)
  4. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
  5. AC_CONFIG_SRCDIR([include/str.h])
  6. AC_CONFIG_HEADER([config.h])
  7. # Checks for programs.
  8. AC_PROG_CC
  9. # Checks for libraries.
  10. # Checks for header files.
  11. # Checks for typedefs, structures, and compiler characteristics.
  12. # Checks for library functions.
  13. AC_OUTPUT

修改

  1. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

改为:

  1. AC_INIT(str,0.0.1, [bug@sounos.org])

其中:FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址

然后添加两句话:

AM_INIT_AUTOMAKE
    AC_CONFIG_FILES([Makefile])

结果如下:(两句话不是在一起的)

  1. #                                               -*- Autoconf -*-
  2. # Process this file with autoconf to produce a configure script.
  3. AC_PREREQ(2.59)
  4. #AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
  5. AC_INIT(str, 0.0.1, [bug@sounos.org])
  6. AM_INIT_AUTOMAKE
  7. AC_CONFIG_SRCDIR([include/str.h])
  8. AC_CONFIG_HEADER([config.h])
  9. # Checks for programs.
  10. AC_PROG_CC
  11. # Checks for libraries.
  12. # Checks for header files.
  13. # Checks for typedefs, structures, and compiler characteristics.
  14. # Checks for library functions.
  15. AC_CONFIG_FILES([Makefile])
  16. AC_OUTPUT

4、执行aclocal

  1. [root@localhost str]# aclocal
  2. /usr/share/aclocal/libfame.m4:6: warning: underquoted definition of AM_PATH_LIBFAME
  3. run info '(automake)Extending aclocal'
  4. or see http://sources.redhat.com/automake/automake.html#Extending-aclocal

5、制作Makefile.am

  1. [root@localhost str]# vi Makefile.am
  2. #Makefile.am
  3. bin_PROGRAMS    = str
  4. str_SOURCES     = include/str.h src/str.c
  5. str_CPPFLAGS    = -I include/

automake 这个命令需要用到这个配置文件。各个选项意思比较直观,不多说。

6、autoheader

  1. [root@localhost str]# autoheader

7、automake必须文件:

  1. *  install-sh
  2. * missing
  3. * INSTALL
  4. * NEWS
  5. * README
  6. * AUTHORS
  7. * ChangeLog
  8. * COPYING
  9. * depcomp

其中,以下文件在执行automake -a的时候会自动生成

  1. * install-sh
  2. * missing
  3. * INSTALL
  4. * COPYING
  5. * depcomp

所以,接下来手动生成剩下的文件

  1. [root@localhost str]# touch NEWS README AUTHORS ChangeLog

8、执行automake -a

  1. [root@localhost str]# automake -a
  2. configure.ac: installing `./install-sh'
  3. configure.ac: installing `./missing'
  4. Makefile.am: installing `./INSTALL'
  5. Makefile.am: installing `./COPYING'
  6. Makefile.am: installing `./compile'
  7. Makefile.am: installing `./depcomp'

9、autoconf

  1. [root@localhost str]# autoconf
  2. [root@localhost str]# ls
  3. aclocal.m4      autoscan.log  config.h.in   configure.scan  include     Makefile.am  NEWS
  4. AUTHORS         ChangeLog     configure     COPYING         INSTALL     Makefile.in  README
  5. autom4te.cache  compile       configure.ac  depcomp         install-sh  missing      src

10、执行测试:
      执行./configure

  1. [root@localhost str]# ./configure --prefix=/u
  2. checking for a BSD-compatible install... /usr/bin/install -c
  3. checking whether build environment is sane... yes
  4. checking for gawk... gawk
  5. checking whether make sets $(MAKE)... yes
  6. checking for gcc... gcc
  7. checking for C compiler default output file name... a.out
  8. checking whether the C compiler works... yes
  9. checking whether we are cross compiling... no
  10. checking for suffix of executables...
  11. checking for suffix of object files... o
  12. checking whether we are using the GNU C compiler... yes
  13. checking whether gcc accepts -g... yes
  14. checking for gcc option to accept ANSI C... none needed
  15. checking for style of include used by make... GNU
  16. checking dependency style of gcc... gcc3
  17. configure: creating ./config.status
  18. config.status: creating Makefile
  19. config.status: creating config.h
  20. config.status: config.h is unchanged
  21. config.status: executing depfiles commands

执行 make

  1. [root@localhost str]# make
  2. make  all-am
  3. make[1]: Entering directory `/data/devel/c/str'
  4. if gcc -DHAVE_CONFIG_H -I. -I. -I.  -I include/   -g -O2 -MT str-str.o -MD -MP -MF ".deps/str-str.Tpo" -c -o str-str.o `test -f 'src/str.c' || echo './'`src/str.c; \
  5. then mv -f ".deps/str-str.Tpo" ".deps/str-str.Po"; else rm -f ".deps/str-str.Tpo"; exit 1; fi
  6. gcc  -g -O2   -o str  str-str.o
  7. make[1]: Leaving directory `/data/devel/c/str'

此时已经生成了 str(可执行文件名字在前面设置Makefile.am的参数时候去顶)这个,可以通过./str直接看到运行结果

  1. [root@localhost str]# ./str
  2. Please INPUT something end by [ENTER]
  3. abcksdhfklsdklfdjlkfd
  4. ----PRINT STRING----
  5. "abcksdhfklsdklfdjlkfd"

不过这里我们都做一步,把它安装到系统里面,这样我们只要在终端输入str就可以运行程序了。

执行 make install:

  1. [root@localhost str]# make install
  2. make[1]: Entering directory `/data/devel/c/str'
  3. test -z "/u/bin" || mkdir -p -- "/u/bin"
  4. /usr/bin/install -c 'str' '/u/bin/str'
  5. make[1]: Nothing to be done for `install-data-am'.
  6. make[1]: Leaving directory `/data/devel/c/str'

接下来你可以make clean 清除安装的那些.o 文件了。

这样生成了一个自动的Makefile。

最新文章

  1. 压测session优化
  2. [OC笔记]我的第一个OC程序
  3. [转] Asp.net vNext webapi 自托管
  4. C++模板【转】
  5. css 之优先策略
  6. BZOJ 2754 喵星球上的点名(后缀数组)
  7. KeepAlive详解
  8. NoSQL的价值到底在哪里?
  9. ocp11g培训内部教材_053课堂笔记(043)_数据备份
  10. Puppent 介绍原理及安装
  11. Pyhton函数篇(一)之函数中的形参与实参
  12. inline, block, and inline-block
  13. 获取字段唯一值工具- -ArcPy和Python案例学习笔记
  14. Android上的单元测试
  15. Scrapy中的POST请求发送和递归爬取
  16. js 基本类型&amp;引用类型
  17. Luogu 4721 【模板】分治 FFT
  18. CF 464E The Classic Problem
  19. django 定制admin
  20. 【转】使用webmagic搭建一个简单的爬虫

热门文章

  1. android -- 蓝牙 bluetooth (二) 打开蓝牙
  2. java String 怎么看里面有几个指定字符
  3. [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)
  4. 循环调用修正sic86 2改后的(除了第一年有点诡异,其他年份可以正常修复)
  5. Android 中 关闭部分 Activity 的方法总结
  6. ArcEngine 图层无闪烁刷新
  7. Ant学习实例
  8. Flask web开发 简单介绍
  9. [蘑菇街] 搜索、算法团队招募牛人啦-年底了走过路过不要错过 - V2EX
  10. location.href使用方法总结