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