2014-01-15

开源软件的安装一般都分三步,

./configure
make
make install

本文以一个例子来简单说明一下如何使用autotool工具来简化程序的编译安装。 执行./configure时,检查编译该程序所需要的条件是否存在,并且将(*.in)文件转化为最终文件(Makefile,config.h…)。当./configure成功后,就生成Makefile了。执行make之后,程序进行编译,之后使用make install进行安装。关于autotool的理论就不赘述了,网上随处都能找到,我只是简单记录一下过程。整个软件的发布如图所示:

我们来创建一个最简单的helloworld工程,目录结构如下。

	helloworld
	|
	|--include
	|  --hello.hxx world.hxx
	|
	|--lib
	| |--hello.cxx world.cxx
	|  --Makefile.am
	|
	|--src
	| |--main.cxx
	|  --Makefile.am
	|
	|--Makefile.am
	|--README, NEWS, ChangeLog, AUTHORS
  1. 我们先创建如上所示的目录结构,使用脚本如下:

     mkdir helloworld
     cd helloworld
     mkdir include
     cd include
     touch hello.hxx world.hxx 
     cd ..
     mkdir lib
     cd lib
     touch hello.cxx world.cxx Makefile.am
     cd ..
     mkdir src
     cd src
     touch main.cxx Makefile.am
     cd ..
     touch NEWS README ChangeLog AUTHORS Makefile.am
    
  2. 各个文件如下内容:

     //main.cxx
    	
     #include "hello.hxx"
     #include "world.hxx"
     #include "config.h" // make configure results available
     int main()
     {
         hello first_word;
         world second_word;
         std::cout<<PACKAGE_STRING; /* use the preprocessor definitions
         from config.h */
         first_word.print();
         second_word.print();
         return 0;
     }
    
     //hello.hxx
    
     #include <iostream>
     #ifndef HELLO_HXX
     #define HELLO_HXX
     class hello{
     public:
     void print();
     };
     #endif
    
     //hello.cxx
    
     #include "hello.hxx"
     void hello::print()
     {
     std::cout<<" Hello ";
     }
    

world的内容跟hello一样,将hello.hxx和hello.cxx中的“hello”换成“world”即可。

  1. 执行autoscan生成一个configure.scan,这是一个模板,我们将其名字改为configure.ac。修改成一下内容:

     #                                               -*- Autoconf -*-
     # Process this file with autoconf to produce a configure script.
    	
     AC_PREREQ([2.68])
     AC_INIT(helloworld, 0.01, liq3ea@163.com)
     AM_INIT_AUTOMAKE
     AC_CONFIG_SRCDIR([include/hello.hxx])
     AC_CONFIG_HEADERS([config.h])
    	
     # Checks for programs.
     AC_PROG_CXX
     AC_PROG_RANLIB
     # Checks for libraries.
    	
     # Checks for header files.
    	
     # Checks for typedefs, structures, and compiler characteristics.
    	
     # Checks for library functions.
    	
     AC_CONFIG_FILES([Makefile
                      lib/Makefile
                      src/Makefile])
     AC_OUTPUT
    
  2. 填写各个目录的Makefile.am:

     helloworld/Makefile.am:
    	
     SUBDIRS=lib src
    
     helloworld/lib/Makefile.am:
    
     noinst_LIBRARIES=libhw.a ## static library which is not to be installed
     libhw_a_SOURCES=hello.cxx hello.hxx world.cxx world.hxx
     libhw_a_CXXFLAGS=-I../include ## add path to headerfiles
    
    
     helloworld/src/Makefile.am:
    
     bin_PROGRAMS=helloworld
     helloworld_SOURCES=main.cxx
     helloworld_CXXFLAGS= -I../include ## add path to headerfiles
     helloworld_LDADD=../lib/libhw.a ## link with static library
    
  3. 接下来执行aclocal autoconf autoheader 命令,然后执行 automake -a 。至此所有该有的文件都有了。

  4. 执行./configure可以看到检测条件过程,执行make编程程序,sudo make install 安装。



blog comments powered by Disqus