用automake建立共享库(动态链接库)Makefile

时间:2021-03-06 12:42:36

要使用automake工具包建立一个交叉编译的共享库的Makefile

这里用的autoconf是2.67版本,在debian下实现:

如果版本低,可以用apt-getinstall automake来装最新的版本,还需要libtool,也需要用apt-get install来安装。

这里建立一个简单的函数库来介绍:

建立目录rx,及源码目录src:

  
  
  
$ mkdir rx
$ mkdir rx / src

在rx/src下编辑rx.c,rx.h两个源文件:

  
  
  
mybdebian: / home / myb / php / rx / src # cat rx . h
# ifndef __RX_H_
# define __RX_H_
int fun
();
# endif
mybdebian:
/ home / myb / php / rx / src # cat rx . c
# include " rx.h "
int fun
()
{
return 1234 ;
}

在rx目录和rx/src目录下分别建立Makefile.am文件

rx目录下的Makefile.am为顶层Makefile.am文件,只要包含其存放源码的子目录即可,内容如下:

  
  
  
AUTOMAKE_OPTIONS = foreign
SUBDIRS
= src

rx/src目录下的Makefile.am内容如下:

  
  
  
AUTOMAKE_OPTIONS = foreign
lib_LTLIBRARIES
= librx.la
librx_la_SOURCES
= rx.c
include_HEADERS=rx.h

其中lib_LTLIBRARIES=后面的“librx.la”为要生成的库文件名,必须写成.la,不能是.so,实际会生成librx.so文件。

下面的librx_la是librx.la把“.”换成下划线“_”后面加上“_SOURCES=”,等号以后为源文件名称,多于一个时用空格隔开。

include_HEADERS=后面的为头文件,是供其它程序包含用的,make install时会复制到安装目录的include 目录中。

回到上层目录,使用autoscan扫描源码目录:

  
  
  
$autoscan
$ls
autoscan.log configure.scan Makefile.am src

把configure.scan改名成为configure.ac

  
  
  
$mv configure.scan configure.ac
  
  
  
AC_OUTPUT([Makefile
src
/ Makefile])

编译这个文件:

  
  
  
$ vim configure . ac
  
  
  
# -*- Autoconf -*-
#
Process this file with autoconf to produce a configure script.

AC_PREREQ([
2.67 ])
AC_INIT([FULL
- PACKAGE - NAME], [VERSION], [BUG - REPORT - ADDRESS])
AC_CONFIG_SRCDIR([src
/ rx.c])
AC_CONFIG_HEADERS([config.h])

# 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_CONFIG_FILES([Makefile
src
/ Makefile])
AC_OUTPUT

修改AC_INIT一句,即把包的全名、版本号及BUG报告email地址添上,如:

  
  
  
AC_INIT(rx2dlib, 0.01 ,resound @ 163 .com)

在它后面加一句:

  
  
  
AM_INIT_AUTOMAKE

这句话是必须的。

由于这个脚本是用于生成共享库的,所以要加一句AC_PROG_LIBTOOL在AC_PROG_CC的下一行:

  
  
  
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL

修改后面的那个AC_CONFIG_FILES语句,改成AC_OUTPUT,并把后面的一条AC_OUTPUT去掉:

  
  
  
AC_OUTPUT([Makefile
src
/ Makefile])

这样,configure.ac就建好了,修改后的内容如下:

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

AC_PREREQ([
2.67 ])
AC_INIT(rx2dlib,
0.01 ,resound @ 163 .com)
AM_INIT_AUTOMAKE

AC_CONFIG_SRCDIR([src
/ rx.c])
AC_CONFIG_HEADERS([config.h])

# 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([Makefile
src
/ Makefile])

然后按顺序执行:

  
  
  
$ aclocal
$ autoconf
$ autoheader
$ libtoolize --automake
$ automake –-add-missing
configure
. ac: 13 : installing ` ./ config . guess'
configure
. ac: 13 : installing ` ./ config . sub'
configure
. ac: 6 : installing ` ./ install-sh'
configure
. ac: 6 : installing ` ./ missing'
src
/ Makefile . am: installing ` ./ depcomp'

这时configure脚本已经生成了。

可以用它来配置生成Makefile了。

如我们要生成交叉编译给ARMCPU使用的共享库,这里假设我们要使用的编译器为arm-none-linux-gnueabi-gcc,并且我们最终在ARM板上执行时,要把库安装到目标板的/usr/local/armrx2d目录中去。可以这样配置:

  
  
  
$./ configure --host = arm-none-linux-gnueabi --prefix =/ usr / local / armrx2d

$make


Make完成后可以到src目录下面的一个隐藏目录.libs目录中看到生成的库文件:

  
  
  
mybdebian: / home / myb / php / rx / src /. libs # ls -l
总计
20
-rw-r--r--
1 root root 2368 04 - 19 22 : 48 librx . a
lrwxrwxrwx
1 root root 11 04 - 19 22 : 48 librx . la - > ../ librx . la
-rw-r--r--
1 root root 930 04 - 19 22 : 48 librx . lai
lrwxrwxrwx
1 root root 14 04 - 19 22 : 48 librx . so - > librx . so . 0.0 . 0
lrwxrwxrwx
1 root root 14 04 - 19 22 : 48 librx . so . 0 - > librx . so . 0.0 . 0
-rwxr-xr-x
1 root root 5422 04 - 19 22 : 48 librx . so . 0.0 . 0
-rw-r--r--
1 root root 2228 04 - 19 22 : 48 rx . o

我们再回到顶层目录,执行makeinstall可以自动安装生成的库到/usr/local/armrx2d/lib目录下。

若使用automake时出现下面错误信息

required file `./ltmain.sh' not found

是因为libtool未配置:

解决办法:

$libtoolize--automake --debug --copy –force

或:

$libtoolize--automake