libtool是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool将处理库的依赖等细节。libtool只与后缀名为lo、la的libtool文件打交道。
**libtool主要的一个作用是在编译大型软件的过程中解决了库的依赖问题;将繁重的库依赖关系的维护工作承担下来,从而释放了程序员的人力资源。**libtool提供统一的接口,隐藏了不同平台间库的名称的差异等细节,生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。
.lo文件
使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息
.la文件
使用libtool编译出的静态库文件
.lai文件
使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息
sudo apt install libtool-binlibtool --mode=compile gcc -g -O -c foo.clibtool编译出两个版本的object,一个是fPIC(位置无关的),放在.libs目录下;另一个则是普通的,放在本地。
libtool --mode=link --tag=CC gcc -g -O -o libfoo.la -rpath /usr/local/lib foo.lolink出两个共享库,一个是static,一个则是dynamic;需要注意的是,-rpath必须有才能产生dynamic库来,如果用-static,则只创建static库。
libtool --mode=install cp libhello.la /usr/local/lib/libhello.la
libtool --mode=install install -c libhello.la /usr/local/lib/libhello.la
两个命令都可以,效果相同# 参数 hello.O文件
libtool --mode=compile gcc -g -O -c hello.c
libtool --mode=link gcc -g -O -o hello hello.lo -rpath /usr/local/lib libfoo.lalibtool --mode=install cp hello /usr/local/bin/hellolibtool --mode=execute hello