用automake建立共享庫(動態鏈接庫)Makefile
要使用automake工具包建立一個交叉編譯的共享庫的Makefile
這里用的autoconf是2.67版本,在debian下實現:
如果版本低,可以用apt-get install 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.cinclude_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了。
如我們要生成交叉編譯給ARM CPU使用的共享庫,這里假設我們要使用的編譯器為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
我們再回到頂層目錄,執行make install可以自動安裝生成的庫到/usr/local/armrx2d/lib目錄下。
若使用automake時出現下面錯誤信息
required file `./ltmain.sh' not found
是因為libtool未配置:
解決辦法:
$libtoolize --automake --debug --copy –force
或:
$libtoolize --automake


