2009-06-04 7 views
15

ビルドプロセスで以前にコンパイルされたオブジェクトファイルと既存の静的ライブラリを含むスタティックライブラリを1つ作成しようとしています。 "ar"を使ってこれを行う簡単な方法はありますか、各ライブラリを展開し(ar x library_name)、そのオブジェクトファイルを統合ライブラリに追加する必要がありますか?"ar"を使って.oと.aファイルを結合する(Linux)

+0

可能な重複http:// stackoverflow。com/questions/386579/pack-shared-libraries-to-the-elf –

+0

いいえ、重複はありません。この質問は、共有ライブラリとの再リンクを試みることを扱いますが、この質問は、まだリンクされていない静的ライブラリやオブジェクトを扱います。 – ephemient

+0

ビルドプロセスを制御する場合、このパターンはきれいな解決策のようです:http://stackoverflow.com/a/4318960/78342 – Chinasaur

答えて

0

他のライブラリからオブジェクトファイルを抽出し、抽出したオブジェクトファイルをコンポジットライブラリにバンドルする必要があります。あなたはこれを使用することができ、共有ライブラリを作成したい場合はld -r

7

はまた、増分ロードを考慮

あなたはldから--whole-アーカイブフラグを使用することができます。

--whole-archive
コマンドラインで--whole-archiveオプションの後に記載されているアーカイブごとに、アーカイブ内のすべてのオブジェクトファイルを必要なオブジェクトファイルのアーカイブを検索するのではなく、リンクを使用します。これは、通常、アーカイブファイルを共有ライブラリに変換し、すべてのオブジェクトを結果としての共有ライブラリに含めるために使用されます。このオプションは複数回使用できます。

gccからこのオプションを使用する場合、2つの注意点があります。まず、gccはこのオプションについて知らないため、-Wl、-whole-archiveを使用する必要があります。第2に、あなたのアーカイブのリストの後ろに-Wl、-no-whole-archiveを使うのを忘れないでください.gccは自分のアーカイブのリストをあなたのリンクに追加します。

静的ライブラリの場合、最初にオブジェクトを抽出する必要があります。

ar

GNU ARは、必要に応じて、アーカイブのメンバーファイルの元のコピーにシンボルインデックスと参照を含んでいる薄いアーカイブを作成することができますのために私は、次を発見しました。このようなアーカイブは、リロケータブルオブジェクトが利用可能であると予想されるローカルビルド内で使用するためのライブラリを構築する場合に便利です。また、各オブジェクトのコンテンツをコピーするだけでは時間と空間が浪費されます。シンアーカイブもフラット化されているため、シンプルアーカイブに1つ以上のアーカイブを追加すると、ネストされたアーカイブの要素が個別に追加されます。アーカイブの要素へのパスは、アーカイブ自体に関連して格納されます。

このようなの薄いアーカイブを使用できますか?

+0

シンアーカイブオプションは(比較的)最近のものです。例えばFedora 8では利用できません(ar 2.17.50)。 – neuro

+0

+1私の人生を救った興味深いオプション(--whole-archive)のために+1! – neuro

1

アーカイブのアーカイブは常に可能です。実際のAPIが実装から呼び出されているときに動作するかどうかはテストしませんでした。

例:AR RC lib1.a obj1.o AR RC lib2.a obj2.o AR RC lib3.a lib1.a lib2.a

you can check the contents of lib3.a by trying out. 

    ar x lib3.a which would extract lib1.a and lib2.a 

しかし、あなたはAPIを呼び出す構築する必要がありますobj1.oとobj2.oから個々のアーカイブからオブジェクトファイルを抽出する必要はありません。

希望すると助かります!

関連する問題