Project 文件目录如下
|-- include
| |-- funca.h
| `-- funcb.h
|-- src
| |-- funca.c
| `-- funcb.c
`-- test
`-- test.c
--include:
-- funca.h
#ifndef __FUNCA_H__
#define __FUNCA_H__
void funca();
#endif
-- funcb.h
#ifndef __FUNCB_H__
#define __FUNCB_H__
void funcb();
#endif
|-- src
| |-- funca.c
#include <stdio.h>
void funca(){
printf("this is the funca.....\n");
}
| `-- funcb.c
#include <stdio.h>
void funcb(){
printf("this is the funca.....\n");
}
`-- test
`-- test.c
#include <stdio.h>
#include "funca.h"
#include "funcb.h"
int main(){
funca();
funcb();
printf("this is the test \n");
return 0;
}
其中AUTHORS, ChangeLog, NEWS, README四个文件是手工新建的空文件,里面啥都没有,真实项目写入相应信息即可。
.使用autotools,目的是管理我的工程,并生成一个可以发布的软件包。用户通过
.configure make make install 就可以安装我们开发的软件包,当然为了autotools
能识别用户的安装的选项,如果安装的路径,关闭软件的某些,打开软件的某些功能
这就需要生成一个configure 配置文件。
.autotools并不能文件完全自动生成其所需的所有文件,因此我们必须手动添加一些文件,.
.configue.in 各级目录下的Makefile.am 文件。
.configue.in 的产生过程。
1. 执行autoscan命令生成configure.scan文件
新增加文件autoscan.log configure.scan
2 修改 configure.scan,并且把configure.scan改为configure.in文件
#configue.in 内容如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.65])
AC_INIT([test], [1.0], [xx@xx])
AC_CONFIG_SRCDIR([test/test.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
3新建 projrct src test 目录下的Makefile.am 文件
.project
|---Makefile.am
SOURDIRS = src test
|---src
Makefile.am 内容:
.libtest_LTLIBRARES = libtest.la
.libtest_la_SOURCES = funca.c \
.funcb.c
|---test
INCLUDES= -I$(top_srcdir)/include
bin_PROGRAMS = test
test_SOURCES = test.c
test_LDADD = $(top_builddir)/src/libtest.la
4修改完成后执行如下命令尝试能否生存configure 文件
不幸的是出现了错误:
configure.in:8: error: possibly undefined macro: AM_INIT_AUTOMAKE
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.in:11: error: possibly undefined macro: AC_PROG_LIBTOOL
因为找不到AM_INIT_AUTOMAKE宏,不要担心,因为我们少做了一步,先要把这些宏生成一下,当然是自动的。
$aclocal
$autoconf
现在的autoconf没有报错。这个时候再看看目录下面,发现多了一个aclocal.m4文件,这就是aclocal声称的宏命令文件,autoconf会使用它来生成新的configure脚本。
是不是现在就能够自动搞定Makefile了?我们现在再执行一下configure,看看输出:
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."
和我们想的有点不同,我们还要用到automake命令做一些其它的事情,我们先执行一下:$automake
configure.in:11: required file `./config.guess' not found
configure.in:11: `automake --add-missing' can install `config.guess'
configure.in:11: required file `./config.sub' not found
configure.in:11: `automake --add-missing' can install `config.sub'
configure.in:8: required file `./install-sh' not found
configure.in:8: `automake --add-missing' can install `install-sh'
configure.in:11: required file `./ltmain.sh' not found
configure.in:8: required file `./missing' not found
configure.in:8: `automake --add-missing' can install `missing'
automake: no `Makefile.am' found for any configure output
automake: Did you forget AC_CONFIG_FILES([Makefile]) in configure.in?
哦,不行,还要install-sh,missing文件,错误信息中,还提到AC_CONFIG_FILES([Makefile]),是的,我们还要修改一下configure.ac,在最后一行AC_OUTPUT前面增加一行:
AC_CONFIG_FILES([Makefile])
现在再执行一次automake吧,但是我们要加一个参数:
$automake --add-missing
configure.in:11: installing `./config.guess'
configure.in:11: installing `./config.sub'
configure.in:8: installing `./install-sh'
configure.in:11: required file `./ltmain.sh' not found
configure.in:8: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING' using GNU General Public License v3 file
Makefile.am: Consider adding the COPYING file to the version control system
Makefile.am: for your code, to avoid questions about which license your project uses.
configure.in:7: required file `config.h.in' not found
现在发现还有几个文件需要我手动创建
NEWS README AUTHORS ChangeLog
前面缺的四个文件简单,我们按照自己的情况编辑保存即可,config.h.in从哪里来呢? 现在让我们把config.h.in搞出来,这个要用到autoheader,我们执行命令:
$autoheader
config.h.in文件就生成好了。准备好了其它几个文本文件,我们再执行一次,这次不用加参数了,不过我们还要再执行一次autoconf,因为我们修改了configure.in之后还没有执行过 autoconf。
$autoconf
然后我生存需要Makefile文件执automake命令
$automake
结果和我们想的不一样。
configure.in:11: required file `./ltmain.sh' not found
原来是缺少了库依赖关系处理脚本,解决方法配置即可:
$ libtoolize --automake --copy --debug --force
在执行命令automake
$ automake
未见异常,该到了configure步骤了。
$./configure
生成了我要的Makefile 文件
$make
make all-am
make[1]: Entering directory `/home/kaiyuan/Templates/autool2'
make[1]: Leaving directory `/home/kaiyuan/Templates/autool2'
但是没有结果;
进入src
$ make
…………………………………………………………….
在进入 test
$make
/bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -o test test.o ../src/libtest.la
libtool: link: gcc -g -O2 -o .libs/test test.o ../src/.libs/libtest.so
生成了我想看到的文件test
$ ./test
this is the funca.....
this is the funcb.....
this is the test