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

生成configure过程中各文件之间的关系图

用automake建立共享库(动态链接库)Makefile_第1张图片

详细介绍

autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

aclocal:根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件 aclocal.m4中。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”

automake:将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换 为Makefile。如果在configure.ac中定义了一些特殊的宏,比如AC_PROG_LIBTOOL,它会调用libtoolize,否则它 会自己产生config.guess和config.sub

autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。

实例

要使用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;
}

Makefile.am

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

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

AUTOMAKE_OPTIONS=foreign
SUBDIRS=src

.PHONY: auto_clean
 
auto_clean: distclean
	find . -name Makefile.in -exec rm -f {} \;
	rm -rf autom4te.cache
	rm -f missing aclocal.m4 config.h.in config.h.in~ config.guess config.sub ltmain.sh install-sh configure depcomp compile

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

编译这个文件:
$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,[email protected])

在它后面加一句:

AM_INIT_AUTOMAKE

这句话是必须的。

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

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL

 

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

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

AC_PREREQ([2.67])
AC_INIT(rx2dlib,0.01,[email protected])
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_CONFIG_FILES([Makefile
                 src/Makefile])
AC_OUTPUT

然后按顺序执行:

$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

 

用automake建立共享库(动态链接库)Makefile:
https://blog.csdn.net/wh8_2011/article/details/78832295?utm_source=blogxgwz9

Makefile.am文件详解:
https://blog.csdn.net/u013485792/article/details/51355668
 

你可能感兴趣的:(linux)