如何提取包含重复对象文件的静态库



我正在尝试构建一个合并两个静态库的大型静态库。此刻,我正在使用"ar"命令,例如从"a.a"one_answers"b.a"中提取对象,然后再次使用"ar"重新组装这些对象:

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

不幸的是,它不符合我的目的,因为a.a在不同的对象内部有相同的名称。"ar"命令提取重复的对象,并用相同的名称替换已提取的对象。即使使用相同的名称,这些对象也有不同的符号,所以我得到了未定义的引用,因为一些符号和替换的文件一起丢失了。

我无法访问原始对象,已经尝试过"ar-xP"one_answers"ar-xv"以及许多"ar东西"。有人能帮我展示如何合并这些库吗?

提前谢谢。

我尝试了"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. 您必须从静态库(包含重复对象的库)中提取对象
  2. 然后,您必须从提取的对象中构建一个新的库
  3. 新库将只包含复制对象的一个实例
  4. 您必须使用ar t命令从两个库中生成对象列表(原始库中有重复项,新库中没有重复项)
  5. 然后使用例如vimdiff来检查两个列表之间的差异
  6. 写下所有的差异
  7. 然后使用命令ar x my_original_lib.aobject.o从原始库中仅提取这些对象(步骤6)
  8. 然后将生成的提取对象重命名为您喜欢的任何名称
  9. 然后使用命令ar m my_original_lib.a object.o重新排列对象。o
  10. 然后使用与步骤7相同的命令,您将提取第二个对象。o
  11. 为新提取的对象指定不同的名称
  12. 使用它们来构建新库
  13. 该方法适用于静态库中任意数量的重复对象。只需重复使用第9步和第7步即可提取所有配音

您可以重命名对象——在链接过程中,它们的名称没有任何意义。这应该有效:

 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

这里有一个C++代码,它将许多库合并到一个新库中,而不会覆盖可能的重复对象:http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/

相关内容

  • 没有找到相关文章

最新更新