在linux中,la是使用libtool編譯出的庫文件,是記錄同名動態(tài)庫和靜態(tài)庫相關(guān)信息的文本文件;該文件是通過libtool保存在平臺之間的唯一文件。libtool是一個通用庫支持腳本,只與后綴名為lo、la的libtool文件打交道。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux中l(wèi)a是什么文件
la: 使用libtool編譯出的庫文件,其實是個文本文件,記錄同名動態(tài)庫和靜態(tài)庫的相關(guān)信息
libtool的工作原理
libtool 是一個通用庫支持腳本,將使用動態(tài)庫的復(fù)雜性隱藏在統(tǒng)一、可移植的接口中;使用libtool的標(biāo)準(zhǔn)方法,可以在不同平臺上創(chuàng)建并調(diào)用動態(tài)庫??梢哉J(rèn)為libtool是gcc的一個抽象,其包裝了gcc(或者其他的編譯器),用戶無需知道細(xì)節(jié),只要告訴libtool需要編譯哪些庫即可,libtool將處理庫的依賴等細(xì)節(jié)。libtool只與后綴名為lo、la為的libtool文件打交道。
擴(kuò)展知識:
linux下的so、o、lo、a、la文件有什么區(qū)別?
-
o: 編譯的目標(biāo)文件
-
a: 靜態(tài)庫,其實就是把若干o文件打了個包
-
so: 動態(tài)鏈接庫(共享庫)
-
lo: 使用libtool編譯出的目標(biāo)文件,其實就是在o文件中添加了一些信息
libtool主要的一個作用是在編譯大型軟件的過程中解決了庫的依賴問題;將繁重的庫依賴關(guān)系的維護(hù)工作承擔(dān)下來,從而釋放了程序員的人力資源。libtool提供統(tǒng)一的接口,隱藏了不同平臺間庫的名稱的差異等細(xì)節(jié),生成一個抽象的后綴名為la高層庫libxx.la(其實是個文本文件),并將該庫對其它庫的依賴關(guān)系,都寫在該la的文件中。該文件中的dependency_libs記錄該庫依賴的所有庫(其中有些是以.la文件的形式加入的);libdir則指出了庫的安裝位置;library_names記錄了共享庫的名字;old_library記錄了靜態(tài)庫的名字。
當(dāng)編譯過程到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的參數(shù)給激發(fā)出的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”當(dāng)作參數(shù)傳給gcc命令行;如果是后者,libtool將從/usr/lib/libb.la中讀取實際的libb.so的庫名稱和路徑,然后組合成參數(shù)“/usr/lib/libb.so”傳遞給gcc命令行。