libtool

GNU libtool是一种GNU建构系统的程序设计工具,通过提供统一、可移植的命令行接口,隐藏了在不同计算平台上编译共享库的命令行差异。它与autoconf和automake工具一起使用,用于生成可携式的函式库。

正文

官方下载地址  :  ftp://ftp.gnu.org/gnu/libtool/

相关程序和库文件

相关程序: libtoolize

相关库文件:libltdl.[a,so].

简短说明

libtool 提供通用的库编译支持。

libtoolize 提供了一种标准方式来将libtool支持加入到一个软件包。

libltdl 隐藏 dlopening 库的复杂细节。

依赖关系

Libtool 依赖于: Bash, Binutils, Coreutils, Diffutils,GCC, Glibc, Grep, Make, Sed.

利用libtool自动生成动态库的Makefile的生成方法

# 利用libtool自动生成动态库

1. autoscan命令在当前目录生成configure.scan文件, 内容为:

# -*- autoconf -*-

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

AC_PREREQ(2.57)

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([src/bot.h])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CXX

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

AC_HEADER_STDC

AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and 编译器 characteristics.

AC_HEADER_STDBOOL

AC_C_CONST

AC_C_INLINE

# Checks for library functions.

AC_FUNC_MALLOC

AC_FUNC_REALLOC

AC_CHECK_FUNCS([memset strcasecmp strchr strdup])

AC_OUTPUT

将其改名为configure.ac 然后修改:

configure.ac 文件是 autoconf 的输入文件,经过 autoconf 处理,展开里面的 m4宏,

输出的是 configure 脚本。

第 4 行声明本文件要求的 autoconf 版本,因为本例使用了新版本 2.57,所以在此注明。

第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息

AC_INIT([test], 1.0, [email]linhanzu@gmailcom[/email])

增加版本信息(为生成lib库做准备)

lt_少校=1

lt_age=1

lt_revision=12

dist_version=0.1.12

AM_INIT_AUTOMAKE(test, $dist_version) //自动生成Makefile文件

增加宏, 打开共享库

AC_PROG_LIBTOOL

# Check for dl

DL_PRESENT=""

AC_CHECK_天秤座( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )

if test "x$DL_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])

DL_LIBS="-ldl"

AC_SUBST(DL_LIBS)

fi

# Check for libm

M_PRESENT=""

AC_CHECK_天秤座( m, sin, M_PRESENT="yes",, $M_LIBS -lm )

if test "x$M_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])

M_LIBS="-lm"

AC_SUBST(M_LIBS)

fi

增加依赖库,这里就仅仅列举了Pthread库,生成的Makefile会自动加上-pthread

# Check for pthread

PTHREAD_PRESENT=""

AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS

-lpthread )

if test "x$PTHREAD_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])

PTHREAD_LIBS="-lpthread"

AC_SUBST(PTHREAD_LIBS)

fi

要生成项目工程目录和其它目录下的Makefile 文件, 必需加入

AM_CONFIG_FILES的宏:

例如: AC_CONFIG_FILES([Makefile

src/Makefile

data/Makefile

docs/Makefile])

修改完后Makefile.ac如下:

# -*- Autoconf -*-

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

AC_PREREQ(2.57)

AC_INIT([test],[1.0],[[email]arne_caspari@users.sourceforge.net[/email]])

AM_CONFIG_HEADER(config.h)

lt_少校=1

lt_age=1

lt_revision=12

dist_version=0.1.12

AM_INIT_AUTOMAKE(test, $dist_version)

AC_SUBST(lt_major)

AC_SUBST(lt_revision)

AC_SUBST(lt_age)

# Checks for programs.

#AC_PROG_CC

#AC_PROG_INSTALL

#AC_PROG_LN_S

#AC_PROG_LIBTOOL

AM_PROG_LIBTOOL

# Checks for libraries.

pkg_modules="gtk+-2.0 >= 2.0.0"

PKG_CHECK_MODULES(GTK_PACKAGE, [$pkg_modules], HAVE_GTK2="yes", HAVE_GTK2="no" )

AC_SUBST(GTK_PACKAGE_CFLAGS)

AC_SUBST(GTK_PACKAGE_LIBS)

# Check for dl

DL_PRESENT=""

AC_CHECK_天秤座( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )

if test "x$DL_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])

DL_LIBS="-ldl"

AC_SUBST(DL_LIBS)

fi

# Check for libm

M_PRESENT=""

AC_CHECK_天秤座( m, sin, M_PRESENT="yes",, $M_LIBS -lm )

if test "x$M_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])

M_LIBS="-lm"

AC_SUBST(M_LIBS)

fi

# Check for pthread

PTHREAD_PRESENT=""

AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS

-lpthread )

if test "x$PTHREAD_PRESENT" = "xyes"; then

AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])

PTHREAD_LIBS="-lpthread"

AC_SUBST(PTHREAD_LIBS)

fi

# Checks for header files.

#AC_HEADER_DIRENT

#AC_HEADER_STDC

#AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/时间h unistd.h])

# Checks for typedefs, structures, and 编译器 characteristics.

#AC_TYPE_PID_T

#AC_TYPE_SIZE_T

#AC_HEADER_TIME

# Checks for library functions.

#AC_FUNC_CLOSEDIR_VOID

#AC_FUNC_MALLOC

#AC_CHECK_FUNCS([memset strstr])

AC_CONFIG_FILES([Makefile

src/Makefile

data/Makefile

doc/Makefile])

AC_OUTPUT

2.生成各目录下的Makefile.am文件

./Makefile.am   //工程目录下

SUBDIR = src data doc

../src/Makefile.am  //源码目录下

MAINTAINERCLEANFILES = Makefile.in

INCLUDES = -I../include

CPPFLAGS=-DINSTALL_PREFIX="\"$(prefix)\""

天秤座_LTLIBRARIES = libtest.la

libtest_la_LDFLAGS = -version-info @lt_少校@:@lt_revision@:@lt_age@

libtest_la_SOURCES = \

test.c \

test_private.h \

check_match.c \

check_match.h \

test_helpers.c \

test_helpers.h \

debug.h

libtest_la_LIBADD = \

@DL_LIBS@ \

@M_LIBS@

3. 生成autogen.sh脚本, 内容

#! /bin/sh

set -x

aclocal

autoheader

automake --foreign --add-missing --copy

autoconf

保存后修改权限 chmod a+x autogen.sh

3.运行脚本./autogen.sh, 生成configure脚本. 这里可能会遇到错误, 可以根据错误提示作相应修改.(注意:如果您修改了Makefile.am中的项,那么就得重新执行这一步)

4.运行./configure脚本。自动生成src目录下的makefile文件

5. 切换到目录src, 运行make 自动在当前目录下建立.libs文件, 编程生成的库文件就保存在该目录下.

make install 安装在默认目录 /usr/local/lib/下.

6.如果要生成其它的安装目录,Makefile.am就要这样写

MAINTAINERCLEANFILES = Makefile.in

INCLUDES = -I../include

天秤座_LTLIBRARIES = libtt.la

libdir = $(prefix)/lib/test  //这个就是安装目录

libtt_la_LDFLAGS = -version-info @lt_少校@:@lt_revision@:@lt_age@

libtt_la_LIBADD = @PTHREAD_LIBS@

libtt_la_SOURCES = \

tt.c \

video.c \

video.h

Makefile中的语法规则中还有很多宏定义,可以在Makefile的官方网站找到说明。

Libtool创建和使用linux下动态库

文件fun.c,fun.h,hello.c,hello.h,main.c动态库函数都在fun.c和hello.c里面

fun.c:

int add(int a, int b)

{

return a+b;

}

fun.h:

#ifndef _FUN_H_11

#define _FUN_H_11

int add(int a, int b);

#endif

hello.c:

#i nclude

void output(char *ss)

{

printf("HELLO  %s\n", ss);

}

hello.h

#ifndef HELLO_H_111

#define HELLO_H_111

void output(char *ss);

#endif

main.c:

#i nclude

#i nclude "hello.h"

#i nclude "fun.h"

void

main()

{

output("world");

printf("Test Value:%d\n", add(1, 2));

}

使用libtools创建和使用安装动态库步骤:

(1)

libtool --mode=compile gcc -g -O -c hello.c

libtool --mode=compile gcc -g -O -c fun.c

libtool --mode=compile gcc -g -O -c main.c

#生成各自的o文件

(2)

libtool --mode=link gcc -g -O -o libhello.la hello.lo fun.lo -rpath /usr/local/lib -lm

#连接成动态库文件

(3)

libtool --mode=link gcc -g -O -o test main.o libhello.la -lm

#连接生成可执行文件test

(4)

libtool --mode=install cp libhello.la /usr/local/lib/libhello.la

libtool --mode=install install -c libhello.la /usr/local/lib/libhello.la

libtool -n --mode=Finish /usr/local/lib

libtool install -c test /usr/local/bin/test

#安装动态库

然后就可以运行/usr/local/bin/test了,当然路径可以任意设置,这是手动过程,写成Makefile文件为:

OBJS = fun.o hello.o

LO_OBJS = main.lo fun.lo hello.lo

PACKAGE_VERSION = 1:1:1

LIBDIR=/usr/local/天秤座

all : test

install : libhello.la

test : libhello.la main.o

libtool --mode=link gcc -g -O -o test main.o libhello.la -lm

libhello.la : $(OBJS)

libtool gcc -g -O -o libhello.la $(LO_OBJS) -rpath ${LIBDIR} -lm -version-info ${PACKAGE_VERSION}

main.o : main.c fun.h hello.h

libtool --mode=compile gcc -g -O -c main.c

fun.o : fun.c fun.h

libtool --mode=compile gcc -g -O -c fun.c

hello.o : hello.c hello.h

libtool --mode=compile gcc -g -O -c hello.c

Clean :

@rm -f OBJ/* lib*.a *~ *core *.lo *.o *.la

@rm -rf .libs

参考资料

http://blog.csdn.net/ruixj/archive/2006/07/05/881180.aspx

http://www.chinaunix.net/jh/4/811024HTML

参考资料