2012-02-08 77 views
5

我正在嘗試構建一個合併兩個靜態庫的大靜態庫。在那一刻我使用的是「AR」命令,再使用「AR」提取物,例如,從「AA」和「BA」,然後重新組裝這些對象:如何提取包含重複目標文件的靜態庫?

$ ar x a.a 
$ ar x b.a 
$ ar r merged.a *.o 

遺憾的是它不工作爲了我的目的,因爲aa在同一個名稱內部有不同的對象。 'ar'命令正在提取重複的對象,並用相同的名稱替換已提取的對象。即使使用相同的名稱,這些對象也具有不同的符號,所以我得到未定義的引用,因爲一些符號與替換的文件一起被遺漏。

我沒有訪問原始對象,已經嘗試過'ar xP'和'ar xv'以及很多'ar stuff'。有沒有人可以幫助我展示如何合併這些庫?

在此先感謝。

回答

3

我試過'AR P',但與朋友說,它是決定下面的Python解決方案可能會更好。現在可以提取重複的目標文件。

def extract_archive(pathtoarchive, destfolder) : 

    archive = open(pathtoarchive, 'rb') 

    global_header = archive.read(8) 
    if global_header != '!<arch>\n' : 
     print "Oops!, " + pathtoarchive + " seems not to be an archive file!" 
     exit() 

    if destfolder[-1] != '/' : 
     destfolder = destfolder + '/' 

    print 'Trying to extract object files from ' + pathtoarchive 

    # We don't need the first and second chunk 
    # they're just symbol and name tables 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    unique_key = 0; 

    while True : 

     content_descriptor = archive.readline() 

     if len(content_descriptor) < 60 : 
      break 

     chunk_size = int(content_descriptor[48:57]) 

     output_obj = open(destfolder + pathtoarchive.split('/')[-1] + '.' + str(unique_key) + '.o', 'wb') 
     output_obj.write(archive.read(chunk_size)) 

     if chunk_size%2 == 1 : 
      archive.read(1) 

     output_obj.close() 

     unique_key = unique_key + 1 

    archive.close() 

    print 'Object files extracted to ' + destfolder + '.' 
+1

太棒了,我有同樣的問題,這個腳本解決了這個問題。 但我相信你應該寫'''content_descripter [48:58]'''而不是48:57。根據[Wikipedia](https://en.wikipedia.org/wiki/Ar_(Unix)),文件大小字段爲10個字節,而不是9個字節。 – 2016-08-01 04:49:32

+1

此外,如果您處理.a文件格式的BSD變體(例如,在Mac上),文件名可以是正文部分的一部分,如[Wikipedia](https://en.wikipedia.org/wiki/Ar_(UNIX))。所以你也需要一個邏輯去除它。 – 2016-08-01 04:57:29

0

您可以重命名對象 - 在鏈接過程中,它們的名稱並不意味着任何內容。這應該工作:

mkdir merge-objs && 
cd merge-objs && 
ar x ../a.a && 
for j in *.o; do mv $j a-$j; done && 
ar x ../b.a && 
ar r ../merged.a *.o && 
cd .. && rm -rf merge-objs 
+2

的問題是他們不」在檔案之間重複重複,但是對象在同一個檔案庫內,在同一檔案庫內重複!當'ar'提取它們時,來自同一個存檔的具有相同名稱的對象將被覆蓋。但感謝您的幫助:) – 2012-02-09 10:31:00

1
  1. 你必須提取從靜態庫中的對象(其中包含重複的對象庫)
  2. 然後,你必須從提取的對象建立一個新的圖書館。
  3. 新庫只包含一個重複對象的實例。
  4. 您必須使用ar t命令來生成兩個庫中的對象列表(原始文件 - 帶有重複的文件,而沒有重複的文件)。
  5. 然後使用例如vimdiff來檢查兩個列表之間的差異。
  6. 寫下所有的差異。
  7. 然後僅提取那些對象(步驟6)從原始庫對象,使用命令的AR X my_original_lib.a object.o
  8. 然後所產生的提取的對象重命名爲任何名稱你喜歡
  9. 然後使用命令AR米my_original_lib.a object.o重新排列object.o
  10. 然後使用相同的命令,如步驟7中,你將提取第二object.o
  11. 給予不同的名稱,新提取的對象
  12. 使用它們來構建新庫。
  13. 該方法適用於靜態庫中任意數量的重複對象。只需使用步驟9和7多次提取所有dublicates
其合併許多庫到一個單一的新的一個,而不會覆蓋可能的複製對象
+0

將許多庫合併爲一個新庫的C++代碼,不覆蓋可能的重複對象,在這裏:http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia 2015-01-11 16:37:48