GNU libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中。官方下载地址  :  ftp://ftp.gnu.org/gnu/libtool/

libtool-相关程序和库文件

相关程序  : libtoolize

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

libtool-简短说明

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

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

libltdl 隐藏 dlopening 库的复杂细节。

libtool-依赖关系

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

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-参考资料

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

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

libtool的知识相关推荐

  1. 云运维 linux centos7.2 LAMP环境搭建 一键全解析

    LAMP架构 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: LAMP=Linux+Apache(httpd)+MySQL+PHP 工作模式: MySQl安装 MySQ ...

  2. linux服务器基本常识,服务器搭建-Linux基础知识

    服务器搭建还是需要一些Linux知识的,这节就聊点基础的. 文件权限操作 查看权限 Linux中每个文件对每个用户来说都有对应的权限,在任一路径中输入ll就可以查看这些信息: root@ip-*** ...

  3. 服务器搭建-Linux基础知识

    服务器搭建还是需要一些Linux知识的,这节就聊点基础的. 文件权限操作 查看权限 Linux中每个文件对每个用户来说都有对应的权限,在任一路径中输入ll就可以查看这些信息: root@ip-*** ...

  4. 硬件基础知识----(20)KVM 深入理解

    KVM 介绍(1):简介及安装 http://www.cnblogs.com/sammyliu/p/4543110.html 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 ...

  5. 学习C++项目——数据库知识学习(主从原理,分离配置,远程工具只是了解,都没有实现)

    学习数据库知识 一.思路和学习方法   本文学习于:B站平台UP主 IT 小当家,学习 MySQL 数据库,如里面加以自己的一些学习复现和理解,如有侵权会进行删除.学习Oracle以后也可以参考之前学 ...

  6. 基于linux上搭建红楼梦知识图谱---后续

    需要安装烧瓶,py2neo,pyltp,BS4 flask我电脑上本来就有,py2neo,bs4直接用pip安装就可以 在安装pyltp的过程中,遇见了麻烦,直接PIP,一直处于构建过程,我等了十五分 ...

  7. 《Autotools – GNU Autoconf, Automake与Libtool实践者指南》第一章

    最近项目中有用到此部分工具,所以在此转载一篇相关文章,如有侵权,请留言告知! 转载于http://www.xuebuyuan.com/2147621.html 前言 本文根据<Autotools ...

  8. 搭建windows下无人机软件在环仿真(SITL)仿真环境,无需任何无人机、飞控硬件,学习无人机通讯等知识

    SITL环境配置方法 APM飞控官网提供的SITL(software in the loop)软件在环仿真 官网地址 通过该虚拟仿真环境可学习地面站操作.Mavlink通信协议等知识. 参照此方法可构 ...

  9. DBUS基础知识(非常全面)

    DBus作为一个轻量级的IPC被越来越多的平台接受,用于进程间通信或进程与内核的通信. DBus进程间通信主要有三层架构: 1.底层接口层:主要是通过libdbus这个函数库,给予系统使用DBus的能 ...

最新文章

  1. Oracle的括号转义字符,SQL中通配符、转义符与括号的使用
  2. 开发app用户协议_兰州移动APP开发用户体验设计不应该做的事
  3. postgresql批量插入数据脚本_每日踩坑 2020-11-04 PostgreSQL 批量插入数据
  4. 计算机专业教学团队建设规划,计信学院教学团队建设方案
  5. Kotlin实战指南二:变量、常量、静态常量
  6. Organization unit determine log logic enablement
  7. Nucleic Acids Research | NONCODE数据库V6版发布,涵盖全面的动植物长非编码RNA注释
  8. mySQL危险命令_MYSQL教程Linux系统中最危险的10条命令
  9. github 快速配置简易教程笔记
  10. 决策树 结构_决策树模型是什么?5步了解好看模型图
  11. sql server父节点_将新节点添加到现有SQL Server Always On可用性组中
  12. 代码质量差,啥都干不好!丨技术大牛:你的代码正在毁掉你!
  13. Java基础__Integer类型中的自动装箱
  14. ios 边录音边放_ios中同时录音和播放
  15. 给potplayer配置iptv源,看所有你想看的电视
  16. 制作WINDOWS图标
  17. 第五届蓝桥杯—— 基础练习:特殊的数字
  18. CUDA学习:GPU硬件连接模型
  19. 一文详解 Interpolator动画插值器
  20. GAMES101 作业0 环境配置 超详细小白教程

热门文章

  1. 选择美国虚拟主机时要考虑的事项
  2. 友盟推送注册成功但是收不到推送
  3. sublime运行python只显示时间_sublime3-python 编译运行不显示内容
  4. 超级详细的redis命令大全
  5. 买拍参考贴中羽主力拍统计
  6. 关于杨创YC2440uboot移植
  7. Android双屏异显
  8. python 写的一些ctf脚本
  9. 八皇后(USACO)
  10. 学习通过标签内部的style设置样式,仅UI