libtool - 利用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 compiler 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@gmail.com[/email])

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

lt_major=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_LIB( 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_LIB( 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_major=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_LIB( 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_LIB( 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/time.h unistd.h])

# Checks for typedefs, structures, and compiler 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)/""

lib_LTLIBRARIES = libtest.la

libtest_la_LDFLAGS = -version-info @lt_major@:@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

lib_LTLIBRARIES = libtt.la

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

libtt_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@

libtt_la_LIBADD = @PTHREAD_LIBS@

libtt_la_SOURCES = /

tt.c /

video.c /

video.h

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

libtool - 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/lib

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

libtool - 参考资料

linux la 的使用方法,libtool使用方法相关推荐

  1. libtool使用方法

    转自:http://www.hudong.com/wiki/libtool libtool - 利用libtool自动生成动态库的Makefile的生成方法 # 利用libtool自动生成动态库 1. ...

  2. 系统dsn oracle,linux平台配置oracle odbc dsn的方法.docx

    linux平台配置oracle odbc dsn的方法.docx LINUX平台配置ORACLEODBCDSN的方法1DSN配置方法ORACLE11编辑配置文件一.OSRHEL5X86(ORACLED ...

  3. Linux下分割与合并文件的方法

    Linux下分割与合并文件的方法 切割合并文件在linux下用split和cat就可以完成.下面举些实例进行说明. 1.文件切割 文件切割模式分为两种: 文本文件 二进制模式. 1.1文本模式 文本模 ...

  4. windows兼容Linux php,支持windows与linux的php计划任务的实现方法

    本文实例讲述了支持windows与linux的php计划任务的实现方法.包括了在winows下利用winodows计划任务来操作,还有在linux中利用linux的方法来实现.分享给大家供大家参考.具 ...

  5. linux实现时间服务器视频,linux实现时间同步有哪几种方法

    原标题:linux实现时间同步有哪几种方法 方法一:用ntpdate从时间服务器更新时间 如果linux系统没有ntpdate这个命令,可以输入以下代码进行安装 yum install ntp 安装完 ...

  6. linux查看文件隐藏字符,Linux使用cat命令显示隐藏字符的方法

    Linux系统中,使用普通的文本编辑器查看的时候,有些字符是不显示的,这就需要使用到cat命令来查看,下面小编就给大家介绍下Linux使用cat命令查看隐藏字符的方法,一起来了解下吧. 首先,我们创建 ...

  7. 嵌入式linux文件系统格式,嵌入式Linux的文件系统分区及数据读写方法与流程

    本发明涉及Linux系统的数据存储管理领域,特别是涉及一种基于NANDFlash存储器和UBIFS文件系统的嵌入式Linux的文件系统分区及数据读写方法. 背景技术: ::目前Linux操作系统由于源 ...

  8. linux -bash: ipconfig: command not found 解决方法

    linux -bash: ipconfig: command not found 解决方法 参考文章: (1)linux -bash: ipconfig: command not found 解决方法 ...

  9. [转]Linux下pppoe配合Drcom插件上网方法介绍......

    Linux下pppoe配合Drcom插件上网方法介绍 近几天在西邮bbs上闲逛,无意间注意到很多人纠结于同一个问题---linux上网,众所周知,linux系统在宿舍上网时比较烦人的一件事,虽然bbs ...

最新文章

  1. 复习java基础第二天(异常处理)
  2. EM算法——有隐含变量时,极大似然用梯度法搞不定只好来猜隐含变量期望值求max值了...
  3. 阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新
  4. 需求评审五个维度框架分析及其带来的启示-4-需求条目化管理
  5. React开发中使用fetch进行异步请求
  6. IDA工具各个功能总结
  7. 3dmax导出obj序列_Houdini导出序列图片
  8. 解决 Tomcat禁用OPTIONS协议(不安全的HTTP方法)
  9. UVA10602 Editor Nottoobad【贪心】
  10. Python 爬取多玩图库
  11. web 前端课程体系(1/4)
  12. crispr基因编辑技术的应用进展
  13. Cocos Studio images文件与CSB的路径相对关系
  14. win10系统联想电脑亮度自动调节怎么办?
  15. 微信公众平台开发(54)翻板抽奖
  16. 21届实习腾讯面试的经验贴(已凉)
  17. 【模式识别】Boosting
  18. 360度全景的地拍如何制作?
  19. android仿摩拜贴纸碰撞|气泡碰撞
  20. 学生档案信息管理系统java_基于jsp的学籍档案信息管理系统-JavaEE实现学籍档案信息管理系统 - java项目源码...

热门文章

  1. 【Avalon总线】1.Avalon总线总体介绍
  2. Avalon总线(二)
  3. 华硕天选4FX507ZV ZC ZU原厂系统 带ASUS Recovery恢复功能
  4. vue-router 官方文档学习
  5. How to wipe silicon to CPU 如何给CPU正确涂抹硅脂
  6. bvh文件读取(blender版)
  7. Mac之关机、睡眠、一直开机的利与弊
  8. Mysql分组排序取每组第一条(二种实现方式)
  9. 前端Hover与动画过渡结合
  10. BT客户端源码分析之八:BT对等连接的建立过程