2010-11-30 28 views
3

從本質上講,我想做的事情是這樣的:ar在現有的.a文件上?

gcc foo.c -o foo.o 
ar rcs foo.a foo.o 
gcc bar.c -o boo.o 
ar rcs bar.a bar.o foo.a 

我想既存檔對象和靜態庫到另一個靜態庫。不幸的是,最後一個命令並沒有包含foo.o(它包含bar.o和foo.a),所以當我到達鏈接階段時,鏈接器無法從foo.o中找到符號。

有沒有辦法做到我想要的?我正在做所有這些,所以我正在尋找一種解決方案,不涉及提取重新歸檔對象(這看起來有點痛苦)。有沒有辦法讓這種「從另一個檔案文件歸檔」設置工作?

回答

3

實際上,你不想將一個完整的'.a'文件存檔到另一個。您可能希望將其中一個檔案的成員歸檔到另一個檔案中 - 但這是完全不同的操作。 'ar'程序完全能夠存儲源文件,gzipped tar文件,HTML文件,XML文件以及'.a'中的任何其他類型的文件(而'.a'後綴是隻有傳統的,不是強制性的) - 嘗試一段時間。但是,它專門處理目標文件(僅限於目標文件),並使其可供鏈接程序('ld')使用,但鏈接程序僅在擴展名爲「.a」時才使用此類文件。

所以,你想有兩個庫:

  1. foo.a只包含foo.o
  2. bar.abar.o,所有的物體從foo.a

做你的建議和提取的短對象從foo.a並將它們構建爲bar.a,唯一的選擇是列出成員foo.abar.a太成員:

FOO_OBJS = foo.o 
BAR_OBJS = bar.o $(FOO_OBJS) 

foo.a: $(FOO_OBJS) 
    $(AR) $(ARFLAGS) [email protected] $(FOO_OBJS) 
bar.a: $(BAR_OBJS) 
    $(AR) $(ARFLAGS) [email protected] $(BAR_OBJS) 

我假設你的榜樣最小化。如果不是,那麼爲什麼還要打擾兩個圖書館。任何只使用foo.o代碼的東西只會鏈接foo.o,即使給定bar.a鏈接。 (如果這些是共享對象,則會略有不同,但使用僅一個而不是兩個共享對象可能會更好)。

2
ar rcs foo.a foo.o 
cp foo.a foo2.a 
gcc -c bar.c 
ar rs foo2.a bar.o 

並可能使用foo.a而不是foo2.a如果你並不需要保存在其原來的形式。

相關問題