libtool是一個十分有用的通用庫支持腳本,將使用動態庫的複雜性隱藏在統一、可移植的接口中;使用libtool的標准方法,可以在不同平台上創建並調用動態庫。需要的朋友可以來本站下載使用!

libtool簡介
libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool将处理库的依赖等细节。libtool只与后缀名为lo、la的libtool文件打交道。
功能說明
libtool主要的一个作用是在编译大型軟件的过程中解决了库的依赖问题;将繁重的库依赖关系的维护工作承担下来,从而释放了程序员的人力资源。libtool提供统一的接口,隐藏了不同平台间库的名称的差异等细节,生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字。
當編譯過程到link階段的時候,如果有下面的命令:
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
libtool會到/usr/lib路徑下去尋找liba.la,然後從中讀取實際的共享庫的名字(library_names中記錄了該名字,比如liba.so)和路徑(lib_dir中記錄了,比如libdir=’/usr/lib’),返回諸如/usr/lib/liba.so的參數給激發出的gcc命令行。
如果liba.so依赖于库/usr/lib/libb.so,则在liba.la中将会有dependency_libs=’-L/usr/lib -lb’或者dependency_libs=’/usr/lib/libb.la’的行,如果是前者,其将直接把“-L/usr/lib –lb”当作参数传给gcc命令行;如果是后者,libtool将从/usr/lib/libb.la中读取实际的libb.so的库名称和路径,然后组合成参数“/usr/lib/libb.so”传递给gcc命令行。
當要生成的文件是諸如libmylib.la的時候,比如:
$libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la
其依賴的庫的搜索基本類似,只是在這個時候會根據相應的規則生成相應的共享庫和靜態庫。
注意:libtool在鏈接的時候只會涉及到後綴名爲la的libtool文件;實際的庫文件名稱和庫安裝路徑以及依賴關系是從該文件中讀取的。
2 为何使用 -Wl,--rpath-link -Wl,DIR?
使用libtool解決編譯問題看上去沒什麽問題:庫的名稱、路徑、依賴都得到了很好的解決。但下結論不要那麽著急,一個顯而易見的問題就是:並不是所有的庫都是用libtool編譯的。
libtool常見于autoconf/automake,單獨用的例子很少。