(4)autoheader
(5)automake
一、准备源代码
本项目有三个源文件,分别为score.cpp, sum.cpp, average.cpp
内容分别如下:
score.cpp:
#include <iostream> float Sum(float var[], int sum); float Average(float var[], int sum); using namespace std; int main() { float score[5] = {91, 95, 100, 98, 92}; float sum, average; sum = Sum(score, 5); average = Average(score, 5); cout << "The sum score is " << sum << endl; cout << "The average score is " << average << endl; cout << "H" << endl; return 0; }
float Sum(float var[], int num) { float sum = 0.0; for(int i=0; i<num; i++) sum += var[i]; return sum; }
average.cpp:
float Average(float var[], int num) { float average = 0.0; for(int i=0; i<num; i++) average += var[i]; average /= num; return average; }
2.1 使用autoscan命令,它将扫描工作目录,生成 configure.scan 文件。
liuwei@liuwei:~/score$ ls average.cpp score.cpp sum.cpp liuwei@liuwei:~/score$ autoscan liuwei@liuwei:~/score$ ls autoscan.log average.cpp configure.scan score.cpp sum.cpp
<span style="font-size:18px;">liuwei@liuwei:~/score$ mv configure.scan configure.in liuwei@liuwei:~/score$ ls autoscan.log average.cpp configure.in score.cpp sum.cpp</span>
修改前configure.in文件中的内容为:
<span style="font-size:18px;"># -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.68]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([sum.cpp]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT</span>
<span style="font-size:18px;"># -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.68]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AM_INIT_AUTOMAKE(score, 1.0) AC_CONFIG_SRCDIR([sum.cpp]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile]) AC_OUTPUT</span>
AM_INIT_AUTOMAKE(score, 1.0) AC_CONFIG_FILES([Makefile])</span>
说明:
(1)以“#”号开始的行均为注释行。
(2)AC_PREREQ 宏声明本文要求的 autoconf 版本, 如本例中的版本 2.59。
(3)AC_INIT 宏用来定义软件的名称、版本等信息、作者的E-mail等。
(4)AM_INIT_AUTOMAKE是通过手动添加的, 它是automake所必备的宏, FULL-PACKAGE-NAME是软件名称,VERSION是软件版本号。
(5)AC_CONFIG_SCRDIR 宏用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性.。此处为当前目录下main.c。
(6)AC_CONFIG_HEADER 宏用于生成config.h文件,以便 autoheader 命令使用。
(7)AC_PROG_CC用来指定编译器,如果不指定,默认gcc。
(8)AC_OUTPUT 用来设定 configure 所要产生的文件,如果是makefile,configure 会把它检查出来的结果带入makefile.in文件产生合适的makefile。使用 Automake 时,还需要一些其他的参数,这些额外的宏用aclocal工具产生。
(9)AC_CONFIG_FILES宏用于生成相应的Makefile文件。
2.3 使用 aclocal 命令,扫描 configure.in 文件生成 aclocal.m4文件, 该文件主要处理本地的宏定义,它根据已经安装的宏、用户定义宏和 acinclude.m4 文件中的宏将 configure.in文件需要的宏集中定义到文件 aclocal.m4 中。
liuwei@liuwei:~/score$ aclocal liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log configure.in sum.cpp autom4te.cache average.cpp score.cpp
liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log configure.in sum.cpp autom4te.cache average.cpp score.cpp liuwei@liuwei:~/score$ autoconf liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log configure score.cpp autom4te.cache average.cpp configure.in sum.cpp
liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log configure score.cpp autom4te.cache average.cpp configure.in sum.cpp liuwei@liuwei:~/score$ autoheader liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log config.h.in configure.in sum.cpp autom4te.cache average.cpp configure score.cpp
liuwei@liuwei:~/score$ vim Makefile.am liuwei@liuwei:~/score$ cat Makefile.am AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = score score_SOURCES = score.cpp sum.cpp average.cpp
说明:
(1)其中的AUTOMAKE_OPTIONS为设置automake的选项. 由于GNU对自己发布的软件有严格的规范, 比如必须附带许可证声明文件COPYING等,否则automake执行时会报错. automake提供了3中软件等级:foreign, gnu和gnits, 供用户选择。默认级别是gnu. 在本例中, 使用了foreign等级, 它只检测必须的文件。
(2)bin_PROGRAMS定义要产生的执行文件名. 如果要产生多个执行文件, 每个文件名用空格隔开。
(3)hello_SOURCES 定义”hello”这个可执行程序所需的原始文件。如果”hello”这个程序是由多个源文件所产生的, 则必须把它所用到的所有源文件都列出来,并用空格隔开。如果要定义多个可执行程序,那么需要对每个可执行程序建立对应的file_SOURCES。
liuwei@liuwei:~/score$ automake configure.in:6: required file `./install-sh' not found configure.in:6: `automake --add-missing' can install `install-sh' configure.in:6: required file `./missing' not found configure.in:6: `automake --add-missing' can install `missing' Makefile.am: required file `./depcomp' not found Makefile.am: `automake --add-missing' can install `depcomp'此时再执行 automake --add-missing,可以辅助生成几个必要的文件。
liuwei@liuwei:~/score$ ls aclocal.m4 autoscan.log config.h.in configure.in score.cpp autom4te.cache average.cpp configure Makefile.am sum.cpp liuwei@liuwei:~/score$ automake --add-missing configure.in:6: installing `./install-sh' configure.in:6: installing `./missing' Makefile.am: installing `./depcomp' liuwei@liuwei:~/score$ ls aclocal.m4 average.cpp configure.in Makefile.am score.cpp autom4te.cache config.h.in depcomp Makefile.in sum.cpp autoscan.log configure install-sh missing
执行完automake --add-missing后,可再执行一遍automake
2.8 执行./configure,把 Makefile.in 变成最终的 Makefile 文件。
liuwei@liuwei:~/score$ ./configure此时ls
liuwei@liuwei:~/score$ ls aclocal.m4 config.h configure Makefile score.cpp autom4te.cache config.h.in configure.in Makefile.am stamp-h1 autoscan.log config.log depcomp Makefile.in sum.cpp average.cpp config.status install-sh missing
三、Makefile的用法
3.1 make 命令,用来编译代码, 默认执行”make all”命令,可以看到生成了"score"的可执行文件,
liuwei@liuwei:~/score$ make此时ls
liuwei@liuwei:~/score$ ls aclocal.m4 average.o config.status install-sh missing stamp-h1 autom4te.cache config.h configure Makefile score sum.cpp autoscan.log config.h.in configure.in Makefile.am score.cpp sum.o average.cpp config.log depcomp Makefile.in score.o
liuwei@liuwei:~/score$ ./score The sum score is 476 The average score is 95.2 H
liuwei@liuwei:~/score$ make clean test -z "score" || rm -f score rm -f *.o liuwei@liuwei:~/score$ ls aclocal.m4 config.h configure Makefile score.cpp autom4te.cache config.h.in configure.in Makefile.am stamp-h1 autoscan.log config.log depcomp Makefile.in sum.cpp average.cpp config.status install-sh missing使用make clean生成score可执行程序的过程中,ls的结果是没有.o目标文件的。
3.4 make install 命令把目标文件安装到系统中,此时直接执行score即可运行。
liuwei@liuwei:~/score$ sudo make install [sudo] password for liuwei: make[1]: 正在进入目录 `/home/liuwei/score' test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin" /usr/bin/install -c score '/usr/local/bin' make[1]: 没有什么可以做的为 `install-data-am'。 make[1]:正在离开目录 `/home/liuwei/score' liuwei@liuwei:~/score$ score The sum score is 476 The average score is 95.2 H
原文地址:http://blog.csdn.net/liuwei271551048/article/details/39157403