linux ar 打包庫到另一個庫中

helloxchen發表於2010-11-08
不論你是否遇到過或者想到過這樣的情況,在一個庫中新增另一個庫,這個方法對你們來說都是及其有用的。因為我在網上搜尋了半天還沒有搜尋到與此方法相關的文章。我已經測試過了透過這種方法生成的庫是完全可用的,而且非常方便。透過在實際的專案中我學到了這個很好的方法,所以在這裡給大家介紹一個,希望對大家有幫助。大家就不用走更多的彎路

ar命令的操作選項和任選項我就不介紹了,很簡單,網上也有很多文章在介紹,隨便看看就可以了。如果你不知道,還是應該去先去看看再來這篇文章。

如果我們簡單的透過ar命令把幾個.o檔案,如yuer1.o yuer2.o yuer3.o 和 yucom1.a(hello1.o hello2.o)再此打包成libyuerapi.a是不可以行的,因為在libyuerapi.a中保留了yucom1.a原檔案,而不是把yucom1.a中的.o檔案解壓後在打包到libyuerapi.a中,而我們希望的就是這樣的結果。那我們該怎麼辦呢?當然有一個笨笨的方法,把yucom1.a中的檔案逐個提取出來,然後在打包到libyuerapi.a中,但這樣做也不是很直觀,方便,因為你解壓出來的這些臨時.o檔案,肯定要刪除嘛,你怎麼在yuer1.o yuer2.o yuer3.o ...眾多.o檔案中刪除這裡臨時檔案呢,其實也很麻煩的。所以今天我就來給大家介紹另一種方法,那就是ar指令碼。在網上我始終沒有搜到搜到關於ar指令碼方面的知識,這些都是我透過在實際的專案中總結出來的。所以不完全,但也能實現我們的目的了,以後遇到相關的指令碼,我還會再新增到這篇文章中來的。

假設,我們在當前目錄下有libyucom1.a 和 yuer1.o yuer2.o yuer3.o檔案,其中libyucom1.a中包含這幾個目標檔案hello1.o hello2.o 。我們現在想把這四個檔案打包成一個libyuerapi.a的庫檔案以提供給其他的程式使用。

第一步:
我們在命令終端中一次輸入
echo CREATE libyuerapi.a > ar.mac 回車
echo SAVE >> ar.mac 回車
echo END >> ar.mac 回車
ar -M < ar.mac

我們可一個透過cat ar.mac看到ar.mac檔案中的內容,而且我們也可以看到有一個libyuerapi.a生成了。目前其實裡面什麼都沒有。

第二步:
上一步我們已經成功的建立了libyuerapi.a檔案,現在我們向其中新增.o檔案
ar -q libyuerapi.a yuer1.o
ar -q libyuerapi.a yuer2.o
ar -q libyuerapi.a yuer3.o

第三步:
把libyucom.a新增到libyuerapi.a庫檔案中
我們以同樣的方式建立一個ar.mac檔案
echo OPEN libyuerapi.a > ar.mac 回車
echo ADDLIB libyucom1.a >> ar.mac 回車
echo SAVE >> ar.mac 回車
echo END >> ar.mac 回車
ar -M < ar.mac 回車

注意其中使用的重定向符: ">" ">>" "好了現在我們就成功的將libyucom1.a中的.o檔案打包到libyuerapi.a庫檔案中了,我們只要包含libyuerapi.a對應的標頭檔案就可以使用其中的函式了。呵呵,是不是一下感覺豁然開朗了阿。


上面是在中端中一行一行的輸入,肯定是不方便的,而且平時我們編譯庫的時候也是透過makefile來完成的。所以下面我也將給出makefile的樣例,大家可以參考一下。

我們首先建立一個tool.mak
內容為:
define BUILD_LIBRARY
$(if $(wildcard $@),@$(RM) $@)
$(if $(wildcard ar.mac),@$(RM) ar.mac)
$(if $(filter lib%.a, $^),
@$(ECHO) CREATE $@ > ar.mac
@$(ECHO) SAVE >> ar.mac
@$(ECHO) END >> ar.mac
@$(AR) -M < ar.mac
)
$(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^))
$(if $(filter %.a, $^),
@$(ECHO) OPEN $@ > ar.mac
$(foreach LIB, $(filter lib%.a, $^),
@echo ADDLIB $(LIB) >> ar.mac
)
@$(ECHO) SAVE >> ar.mac
@$(ECHO) END >> ar.mac
@$(AR) -M < ar.mac
@$(RM) ar.mac
)
endef

然後我們建立一個Makefile
內容為:
CC = gcc
AR = ar
RM = rm
CP = cp
ECHO = echo

INCLUDES = -I./
CFLAGS += -O2 $(INCLUDES)

include tool.mak #包含子makefile
TARGET = libyuerapi.a
LIBS = yucom1.a
OBJS = yuer1.o yuer2.o yuer3.o

all:$(TARGET)

$(TARGET):$(OBJS) $(LIBS)
<TAB-SPACE>$(BUILD_LIBRARY)

%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@

clean:
-$(RM) *.o $(TARGET)


Makefile格式請參考我的另一篇文章《簡單而又完整的Makefile(原)》。寫完後,你就可以透過ar -t libyuerapi.a檢視libyuerapi.a的檔案列表了。他顯示的是
yuer1.o
yuer2.o
yuer3.o
yuer4.o
hello1.o
hello2.o
而不是:
yuer1.o
yuer2.o
yuer3.o
yuer4.o
libyucom1.a

到此,我們的目標也就完成了,不知道你是不是正在找這樣一種方法呢?
如果有問題可以發郵件yuqiang@cqu.edu.cn與我聯絡或直接留言。目前這個tool.mak的BUILD_LIBRARY只能連線當前目錄中的一個或多個庫,如果依賴列表裡面還有其他目錄的庫,則還需要一個變數來負責從指定的目錄中搜尋庫,將搜尋到的庫,按上述的方法新增到BUILD_LIBRARY中。

本文來源:『』 有水的地方就有餘
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1041122/,如需轉載,請註明出處,否則將追究法律責任。

相關文章