1.充分利用共享库的能力。libtool 是一个通用库支持脚本

2.我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节,只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件

3.通常libtool是与GNU建构系统中的autoconf和automake这两个工具一起使用

4.libtool生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字

1. 编译

# ./libtool --mode=compile --tag=CC $(CC) -I./include -c test.c    //compile编译
//结果
./libtool --mode=compile --tag=CC cc -I./include -c test.c
libtool: compile: cc -c test.c -fPIC -DPIC -o .libs/test.o
# ./libtool --mode=compile --tag=CC mipsel-linux-gcc -I./include -c test.c

2. 交叉编译需要tag

Language name Tag name
C CC
C++ CXX
Java GCJ
Fortran 77 F77
Windows Resource RC

3. 编译库文件

./libtool --mode=link --tag=CC $(CC) -o libtest.la test.lo -I./include -rpath /usr/local/lib
//结果
./libtool --mode=link --tag=CC cc -o libtest.la test.lo -I./include -rpath /usr/local/lib
libtool: link: rm -fr .libs/libtest.la .libs/libtest.lai .libs/libtest.so .libs/libtest.so.0 .libs/libtest.so.0.0.0
libtool: link: gcc -shared -fPIC -DPIC .libs/test.o -Wl,-soname -Wl,libtest.so.0 -o .libs/libtest.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libtest.so.0" && ln -s "libtest.so.0.0.0" "libtest.so.0")
libtool: link: (cd ".libs" && rm -f "libtest.so" && ln -s "libtest.so.0.0.0" "libtest.so")
libtool: link: ( cd ".libs" && rm -f "libtest.la" && ln -s "../libtest.la" "libtest.la" )

在一些旧版本的系统上,ranlib负责把静态库转换为其他的某种格式,使得新的库能够更快的链接;现在ar命令已经包含了上述功能;

为了兼容性,在makefile中还是保留ranlib

//如果报错
libtool: link: libtool library `dmproc.la' must begin with `lib'
-module //可以解决此问题

3. 编译可执行文件

./libtool --mode=link --tag=CC $(CC) -o test test.lo libtest.la
//结果
./libtool --mode=link --tag=CC cc -o test test.lo libtest.la
libtool: link: cc -o .libs/test .libs/test.o ./.libs/libtest.so -Wl,-rpath -Wl,/usr/local/lib

4. 安装

./libtool --mode=install install libtest.la /usr/local/lib/libtest.la
//结果
./libtool --mode=install install libtest.la /usr/local/lib/libtest.la
libtool: install: install .libs/libtest.so.0.0.0 /usr/local/lib/libtest.so.0.0.0
libtool: install: (cd /usr/local/lib && { ln -s -f libtest.so.0.0.0 libtest.so.0 || { rm -f libtest.so.0 && ln -s libtest.so.0.0.0 libtest.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libtest.so.0.0.0 libtest.so || { rm -f libtest.so && ln -s libtest.so.0.0.0 libtest.so; }; })
libtool: install: install .libs/libtest.lai /usr/local/lib/libtest.la
libtool: finish: PATH="/sbin:/bin:/usr/sbin:/usr/bin:/sbin" ldconfig -n /usr/local/lib

5. 运行

./libtool --mode=execute test 

libtool编译的更多相关文章

  1. 大型项目使用Automake/Autoconf完成编译配置

    http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...

  2. [转] libtool的作用及应用

    今天使用 autoconf 的时候遇到一个 libtool 的问题,觉得这个东西挺有意思,找了个文档过来,暂时记录. 转自:http://blog.csdn.net/larntin2002/artic ...

  3. libtool工具的使用

    http://blog.sina.com.cn/s/blog_602f87700100fc8t.html libtool作用: libtool 是一个通用库支持脚本(/usr/bin/libtool) ...

  4. 使用autoconf完成编译配置

    使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ...

  5. libtool的工作原理

    libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一.可移植的接口中:使用libtool的标准方法,可以在不同平台上创建并调用动态库.可以认为libtool是gcc的一个抽象,其包装了 ...

  6. Linux下编译安装Memcache

    需要gcc,make,cmake,autoconf,libtool等工具,联网后,yum install -y gcc,make,cmake,autoconf,libtool 编译安装libevent ...

  7. 大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)

    使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ...

  8. nginx编译安装以及配置tcp转发

    依赖包安装 yum -y install gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl open ...

  9. libtool

    [从网上摘录的,忘了从哪摘的了]   libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便. 一.libtool的作用offer a ...

随机推荐

  1. DevOps 工程师成长日记系列一:必备知识与技能组合

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...

  2. netcore之RabbitMQ入门

    简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,基于Erlang语言编写. AMQP是什么 AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,它允许一致的客户端应 ...

  3. ansible错误ImportError: No module named ansible.runner记录

    按着官网提供的安装ansible To configure the PPA on your machine and install ansible run these commands: $ sudo ...

  4. Python—实现sftp客户端(连接远程服务器)

    使用SFTP上传与下载文件方式一: import paramiko transport = paramiko.Transport(("106.15.88.182", 22)) # ...

  5. Linux—添加开机启动(服务/脚本)

    系统启动时需要加载的配置文件 /etc/profile./root/.bash_profile/etc/bashrc./root/.bashrc/etc/profile.d/*.sh./etc/pro ...

  6. 渗透测试学习 十九、 XSS跨站脚本漏洞详解 续2

    二阶注入环境搭建 74cms 3.4 直接将源码放在PHPstudy的www路径下,在地址栏中输入127.0.0.1回车 然后进入网站首页,在填写简历里面存在二阶注入 先注册一个账号 创建简历 前面的 ...

  7. CodeForces - 1255C(构造+模拟)

    题意 https://vjudge.net/problem/CodeForces-1255C 一个长度为n的序列,给你n-2个三元组,比如p=[1,4,2,3,5],那么三元组为[1,4,2],[4, ...

  8. appium---uiautomator定位方法

    前面总结了7种定位方法,今天在介绍一种uiautomator方法,其实appium就是基于uiautomator框架实现的,让我们一起看下uiautomator有哪些定位方法可以使用 uiautoma ...

  9. python函数内容

    在刚接触python的时候就有个疑问,什么是函数? python语言的函数和数学语言的函数有区别吗? 什么是函数 数学函数:给定一个数集A,假设其中的元素为x.现对A中的元素x施加对应法则f,记作f( ...

  10. jQuery核心(一)

    API文档:http://jquery.cuishifeng.cn/ 一. jQuery.extend(object) 用于扩展jQuery对象本身.用来在jQuery命名空间上增加新函数. jQue ...