8

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

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

不幸的是,它不适用于我的目的,因为 aa 在内部具有相同名称的不同对象。'ar' 命令提取重复的对象并用相同的名称替换已经提取的对象。即使名称相同,这些对象也有不同的符号,因此我得到未定义的引用,因为某些符号与被替换的文件一起丢失。

我无法访问原始对象,并且已经尝试过“ar xP”和“ar xv”以及很多“ar stuff”。有谁可以帮助我展示如何合并这些库?

提前致谢。

4

4 回答 4

2

我尝试了“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 + '.'
于 2012-02-09T17:27:01.323 回答
1
  1. 您必须从静态库(包含重复对象的库)中提取对象
  2. 然后您必须从提取的对象中构建一个新库。
  3. 新库将仅包含重复对象的一个​​实例。
  4. 您必须使用 art 命令从两个库中生成对象列表(原始的 - 有重复的一个和新的 - 没有重复的)。
  5. 然后使用例如 vimdiff 检查两个列表之间的差异。
  6. 写下所有的差异。
  7. 然后使用命令 ar x my_original_lib.a object.o 从原始库中仅提取那些对象(步骤 6)对象
  8. 然后将生成的提取对象重命名为您喜欢的任何名称
  9. 然后使用命令 ar m my_original_lib.a object.o 重新排列 object.o
  10. 然后使用与步骤 7 相同的命令,您将提取第二个对象.o
  11. 为新提取的对象指定不同的名称
  12. 使用它们来构建新库。
  13. 该方法适用于静态库中任意数量的重复对象。只需重复使用步骤 9 和 7 即可提取所有重复项
于 2014-11-10T16:55:28.933 回答
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
于 2012-02-08T22:26:48.533 回答
0

将许多库合并为一个新库而不覆盖可能的重复对象的 C++ 代码如下:http: //bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head :/0025_arbet_FINAL/

于 2015-01-11T16:41:31.197 回答