libtool编译
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编译的更多相关文章
- 大型项目使用Automake/Autoconf完成编译配置
http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...
- [转] libtool的作用及应用
今天使用 autoconf 的时候遇到一个 libtool 的问题,觉得这个东西挺有意思,找了个文档过来,暂时记录. 转自:http://blog.csdn.net/larntin2002/artic ...
- libtool工具的使用
http://blog.sina.com.cn/s/blog_602f87700100fc8t.html libtool作用: libtool 是一个通用库支持脚本(/usr/bin/libtool) ...
- 使用autoconf完成编译配置
使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ...
- libtool的工作原理
libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一.可移植的接口中:使用libtool的标准方法,可以在不同平台上创建并调用动态库.可以认为libtool是gcc的一个抽象,其包装了 ...
- Linux下编译安装Memcache
需要gcc,make,cmake,autoconf,libtool等工具,联网后,yum install -y gcc,make,cmake,autoconf,libtool 编译安装libevent ...
- 大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)
使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ...
- nginx编译安装以及配置tcp转发
依赖包安装 yum -y install gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl open ...
- libtool
[从网上摘录的,忘了从哪摘的了] libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便. 一.libtool的作用offer a ...
随机推荐
- liteos 异常接管(十五)
1 概述 1.1 基本概念 异常接管是操作系统对在运行期间发生异常的情况进行处理的一系列动作,譬如打印异常发生时当前函数调用栈信息. cpu现场信息.任务的堆栈情况等. 异常接管作为一种调测手段,可以 ...
- Python的 Datetime 、 Logging 模块
Datetime模块 datetime是python处理时间和日期的标准库 类名 date类 日期对象,常用的属性有 year . month . day time类 时间 ...
- [视频教程] 配置vscode的PHP自动补全提示与使用Xdebug进行远程调试debug
默认下载安装完的vscode并不能准确提示和检测PHP的语法错误,需要手动指定一下本机的PHP程序路径.按下面的操作配置完后就能在文件保存的时候检测语法有无错误.打开文件->首选项->se ...
- IAR运行程序警告:undefined behavior: the order of volatile accesses is undefined in this statement
运算符两边都是volatile变量的警告,将IAR设置如下即可:
- 数据库 查询第31-40行数据,ID不连续
一.SQLServer 大致分为两种情况:ID连续和ID不连续. 1.ID连续的情况: select * from A where ID between 31 and 40 2.ID不连续的情况: ( ...
- Jmeter Question 之“集成Ant+Jenkins自动化”
首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...
- layui教程---table
layui.config({ base: "${ctx}/static/js/" }).use(['form', 'layer', 'jquery', 'common','elem ...
- 使用python做一个爬虫GUI程序
整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...
- ORB-SLAM2初步(Tracking.cpp)
今天主要是分析一下Tracking.cpp这个文件,它是实现跟踪过程的主要文件,这里主要针对单目,并且只是截取了部分代码片段. 一.跟踪过程分析 首先构造函数中使用初始化列表对跟踪状态mState(N ...
- [学习笔记] 舞蹈链(DLX)入门
"在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\( ...