2012-02-08 6 views
5

私は2つの静的ライブラリをマージする大きな静的ライブラリを構築しようとしています。現時点では、私は「AA」と「BA」から、例えば、オブジェクトを抽出し、「AR」コマンドを使用して、再度「AR」を使用してこれらのオブジェクトを再構築するよ:繰り返しオブジェクトファイルを含む静的ライブラリをどのように抽出できますか?

$ 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

素晴らしい、私は同じ問題を抱えていて、このスクリプトはこの問題を解決しました。 しかし、48:57の代わりに '' '' 'content_descripter [48:58]' 'と書くべきだと思います。ファイルサイズフィールドは、[Wikipedia](https://en.wikipedia.org/wiki/Ar_(Unix))によると、9バイトの代わりに10バイトです。 –

+1

また、BSDの.aファイル形式(Macなど)を扱う場合、ファイル名は[Wikipedia](https://en.wikipedia.org/wiki)で説明されているように、本体部分の一部にすることができます/ Ar_(Unix))。だからあなたはまたそれを取り除くための論理を必要とするだろう。 –

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

問題は、彼らがいません」アーカイブ間で繰り返されますが、オブジェクトは同じアーカイブ内の同じlib内で繰り返されます! 'ar'がそれらを抽出すると、同じアーカイブのオブジェクトが同じ名前で上書きされます。しかし助けてくれてありがとう:) –

1
  1. あなたは次にあなたが抽出されたオブジェクトから新しいライブラリを構築する必要が静的ライブラリ(重複オブジェクトを含むライブラリー)
  2. からオブジェクトを抽出する必要があります。
  3. 新しいライブラリには、重複したオブジェクトのインスタンスが1つだけ含まれます。
  4. オブジェクトのリストを2つのライブラリから作成するには、ar tコマンドを使用する必要があります(元の複製物と新しい複製物は複製されません)。
  5. たとえば、vimdiffを使用して2つのリストの違いを確認します。
  6. すべての相違点を書き留めます。
  7. は次いでコマンドを使用して、あなたが
  8. を任意の名前に生成抽出されたオブジェクトの名前を変更
  9. AR X my_original_lib.a object.oコマンドを使用して、オブジェクトのみ(ステップ6)は、元のライブラリからオブジェクトを抽出しますAR M my_original_lib.a object.oステップ7のように、同じコマンドを使用して、新たに抽出されたオブジェクト
  10. に異なる名前を付けて第二object.o
  11. を抽出しそしてobject.o
  12. を再配置します
  13. 両方を使用して新しいライブラリを構築します。
  14. このメソッドは、スタティックライブラリ内の任意の数の複製オブジェクトを保持します。ただ、すべてのdublicates
  15. を抽出するために繰り返し手順9と7を使用
可能重複したオブジェクトを上書きすることなく、単一の新しいものに多くのライブラリをマージし
+0

多くのライブラリを1つの新しいライブラリにマージするC++コードは、重複している可能性のあるオブジェクトを上書きすることなく、ここにあります:http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia

関連する問題