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