转自:http://blog.chinaunix.net/space.php?uid=11585335&do=blog&id=2867003
libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便。
 
一。libtool的作用
offer a standard procedure for creating shared libraries on different platforms
libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中,也就是说,你可以通过如下所示的标准方法,在不同平台上创建并调用动态库,我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节,只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件。
 
二。libtool的使用
1.Creating object files

# libtool --mode=compile gcc -g -O -c foo.cgcc -g -O -c foo.c  -fPIC -DPIC -o .libs/foo.ogcc -g -O -c foo.c -o foo.o >/dev/null 2>&1
# libtool --mode=compile gcc -g -O -c hello.cgcc -g -O -c hello.c  -fPIC -DPIC -o .libs/hello.ogcc -g -O -c hello.c -o hello.o >/dev/null 2>&1

【说明】libtool编译出两个版本的relocatable object,一个是fPIC(位置无关的),放在.libs目录下;另一个则是普通的,放在本地。

2.linking shared library

# libtool --mode=link --tag=CC gcc -g -O -o libhello.la -rpath /usr/local/lib foo.lorm -fr  .libs/libhello.a .libs/libhello.la .libs/libhello.lai .libs/libhello.so libs/libhello.so.0 .libs/libhello.so.0.0.0gcc -shared  .libs/foo.o   -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0(cd .libs && rm -f libhello.so.0 && ln -s libhello.so.0.0.0 libhello.so.0)(cd .libs && rm -f libhello.so && ln -s libhello.so.0.0.0 libhello.so)ar cru .libs/libhello.a  foo.oranlib .libs/libhello.acreating libhello.la(cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)

【说明】link出两个共享库,一个是static,一个则是dynamic;需要注意的是,-rpath必须有才能产生dynamic库来,如果用-static,则只创建static库。

ranlib的作用:
On some older UNIX systems, ranlib added a table of contents to archive libraries, which converted each archive to a form that could be linked more rapidly. This is no longer needed as the ar command automatically provides all the functionality ranlib used to provide.
在一些旧版本的系统上,ranlib负责把静态库转换为其他的某种格式,使得新的库能够更快的链接;现在ar命令已经包含了上述功能;
This command is provided as a convenience for software developers who need to maintain Makefiles that are portable across a variety of operating systems.
为了兼容性,在makefile中还是保留ranlib
 
3.install shared library

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

两个命令都可以,效果相同

4.linking executable file

# libtool --mode=link gcc -g -O -o hello hello.lo -rpath /usr/local/lib libhello.lagcc -g -O -o .libs/hello .libs/hello.o  ./.libs/libhello.so

creating hello

-rpath项负责添加运行时库路径,否则只能手工修改LD_LIBRARY_PATH环境变量了。
 验证一下:

# ldd .libs/hellolinux-gate.so.1 =>  (0xffffe000)libhello.so.0 => /usr/local/lib/libhello.so.0 (0x40019000)libc.so.6 => /lib/tls/libc.so.6 (0x40031000)/lib/ld-linux.so.2 (0x40000000)

5.install executable file

#libtool --mode=install cp hello /usr/local/bin/hello

安装可执行程序。

6.运行
libtool --mode=execute hello
或直接运行hello
注意:此处hello已经安装在/usr/local/bin下了,可以用which hello来查看
 
【附】源码
foo.c

#include <stdio.h>
char msg[128]="Hello world";
void print()
{printf("%s\n", msg);
}

hello.c:

#include <stdio.h>
extern char msg[128];
extern void print();
int main()
{print();
}

Makefile:

LO_OBJS = foo.lo
PACKAGE_VERSION = 1:1:1
LIBDIR=/usr/local/lib
BINDIR=/usr/local/binall : helloinstall : libhello.la hellolibtool --mode=install install -c libhello.la${LIBDIR}/libhello.lalibtool --mode=install cp hello ${BINDIR}/hellouninstall : ${LIBDIR}/libhello.la ${BINDIR}/hellolibtool --mode=uninstall /bin/rm ${LIBDIR}/libhello.lalibtool --mode=uninstall /bin/rm ${BINDIR}/hellohello : libhello.la hello.olibtool --mode=install install -c libhello.la${LIBDIR}/libhello.lalibtool --mode=link gcc -g -O -o hello hello.o -rpath ${LIBDIR} libhello.lalibhello.la : $(LO_OBJS)libtool  --mode=link --tag=CC gcc -g -O -o libhello.la$(LO_OBJS) -rpath ${LIBDIR} ${PACKAGE_VERSION}foo.lo : foo.clibtool --mode=compile gcc -g -O -c foo.chello.lo : hello.clibtool --mode=compile gcc -g -O -c hello.cclean :rm -f lib*.a *~ *core *.lo *.o *.la hellorm -rf .libs

这样,用户可以用make编译,make install/uninstall安装/卸载,make clean清除编译临时文件,安装成功后,可以直接执行hello,不必指明路径也不必再另设环境变量LD_LIBRARY_PATH,非常方便!

转载于:https://www.cnblogs.com/Leo-Forest/archive/2012/07/18/2597096.html

libtool的作用及应用【转载】相关推荐

  1. libtool的作用及应用

    libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便.   一.libtool的作用 offer a standard procedu ...

  2. ngnix 作用(通俗易懂)【转载】

    作者:RayeWang www.raye.wang/2017/02/24/quan-mian-liao-jie-nginxdao-di-neng-zuo-shi-yao/ 前言 本文只针对Nginx在 ...

  3. NSLocalizedString不起作用

    程序TESTAPP 环境:XCODE 4.6 OSX  10.8.4 MAC BOOK AIR 2011年版 代码 [doneButton setTitle:NSLocalizedString(@&q ...

  4. 【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...

  5. ThreadPool 线程池的作用

    相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

  6. Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

    转载请注明: Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用 | 学步园 + 转载自 http://www.xuebuyuan.com/282373.html 在串口编程模式 ...

  7. 服务器架设笔记——httpd插件支持mysql字符集选择

    mysql数据库默认的字符集是latin1.默认情况下,我们编译的httpd插件是可以正常读取该类型的数据库,并且不会出现乱码.但是,如果我们的数据库变成其他格式,比如UTF8,那么默认读取出来的数据 ...

  8. osi七层协议和tcp/ip四层协议

    (大部分内容为转载) OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议.OSI七层协议是由ISO (I ...

  9. CS研究笔记-缓存 (转)

    CS中缓存对性能的优化起了非常大的作用,今天做一次深入的研究.经过大致的代码浏览发现CS中的缓存分为2种:一种采用System.Web.Caching,另一种采用HttpContext.Items(由 ...

  10. 如何确定软件测试结束的标准

    在软件消亡之前,如果没有测试的结束点,那么软件测试就永无休止,永远不可能结束.软件测试的结束点,要依据自己公司具体情况来制定,不能一概而论!个人认为测试结束点由以下几个条件决定: 1.基于" ...

最新文章

  1. DFS:深入优先搜索 POJ-2386 Lake Counting
  2. Ado.Net 连接数据库
  3. c2000 pro 固件更新_一加7Pro系统更新新增屏幕侧滑返回手势
  4. 【PAT】A1106 Lowest Price in Supply Chain
  5. kubernetes1.8.4 安装指南 (基于静态Pod方式安装)
  6. HTML5的知识分享(一):HTML5的基础标签
  7. OpenShift 4 - 如何删除Terminating状态的项目
  8. 通俗理解数字签名,数字证书和https
  9. 活出富有成效和充实的十年:让新的一年有个好开始的三条秘诀
  10. 用Rdkit把化学结构式的Smiles转换为InchI
  11. android 简单的贪吃蛇小游戏
  12. 小米3android版本,小米手机
  13. execl批量创建文件夹乱码解决方案
  14. [30期] 个人职业规划
  15. java输出abba_java - 有限状态机搜索“ABBA” - 堆栈内存溢出
  16. 使用Python制作证件照
  17. Xshell工具下载
  18. openlayer加载矢量切片
  19. SWUST OJ 1014: 交换排序算法的设计与实现——冒泡排序
  20. Cannot resolve javax.media:jai_core:1.1.3(pdf文件转换为图片的依赖出错)

热门文章

  1. Starling自适应设备大小的做法
  2. JavaScript(3):基础部分之异常处理
  3. [转]android刷新后R.java不见了
  4. 计算机网络中为什么引入IP地址?
  5. Rational相关工具介绍
  6. 10.MongoDB连接模型(长连接vs短连接vs连接池)
  7. Jenkins系列三通过脚本方式部署maven项目,maven聚合项目到Tomcat
  8. [渝粤教育] 武汉理工大学 金属工艺学B 参考 资料
  9. 动态规划经典例题汇总 (附最全题目链接)
  10. 五个 Linux 下用户空间的调试工具