自动生成Linux下Makefile全攻略(上)

    技术2022-05-11  74

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。   在本文中,将给大家介绍如何使用 autoconfautomake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”“make”“make install”就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章对你也会有很大的帮助。

      1.准备好程序 main.c

       main.c

       #include <stdio.h>

       int main()

      {

          print("hello!");

          return 0;

       }

       #include <stdio.h>

       int main()

      {

          print("hello!");

          return 0;

       }

       #include <stdio.h>

       int main()

      {

          print("hello!");

          return 0;

       }

       #include <stdio.h>

       int main()

      {

          print("hello!");

          return 0;

       }

      2.准备好脚本 autogen.sh  

       autogen.sh

        #!/bin/sh

        aclocal

        autoheader

        automake --add-missing

        autoconf

      3.运行autoscan 生成configure.scan

      4.mv configure.scan configure.ac

      5.configure.ac 中修改

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

      AC_INIT(hello, 0.0.1, ubuntu.yonsan@gmail.com)   并添加 AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile])

     configure.ac

      # -*- Autoconf -*-

      # Process this file with autoconf to produce a configure script.

      AC_PREREQ(2.59)

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

      AC_INIT(hello, 0.0.1, ubuntu.yonsan@gmail.com)

      AC_CONFIG_SRCDIR([main.c])

      AM_CONFIG_HEADER([config.h])

      AM_INIT_AUTOMAKE

      # 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_FUNC_MALLOC

      AC_CONFIG_FILES([Makefile])

      AC_OUTPUT

     6.准备好Makefile.am

     Makefile.am

      AUTOMAKE_OPTIONS = foreign

      bin_PROGRAMS = hello

      hello_SOURCES = main.c

      #noinst_HEADERS =

     7.运行autogen.sh    哼哼, 自动生成了makefile ! 

    以上文件放在同一目录下, 运行./autogen.sh && ./configure && make && ./test

    利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下:

      make all

      产生设定的目标,既范例中的可执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。

      make clean

      清除之前所编译的可执行文件及目标文件(object file, *.o)

      make distclean

      除了清除可执行文件和目标文件以外,也把 configure 所产生的 Makefile 清除掉。 通常在发布软件前执行该命令。

      make install

      将程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。

      make dist

      将程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以 PACKAGE-VERSION.tar.gz 为名称的文件!

      make distcheck

      make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz 文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,方显示这个 tar.gz 文件已经准备好并可以发布了。


    最新回复(0)