2012-02-08 74 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