質問

私が持っていると仮定し3の C の静的ライブラリは、のlibColor.a の上依存すると言う* libRGB。*順番にのlibPixel.a 。ライブラリのlibColor.a のlibColor.a の中にいくつかの参照がで定義されたシンボルの一部にありますので、のlibRGB.a のライブラリに依存すると言われていますのlibRGB.a の。どのように私は独立しており、新たなのlibNewColor.a のに上記のすべてのライブラリを組み合わせていますか?

インディペンデントは、新しいライブラリが定義されたすべてのシンボルを持つことを意味します。リンク時ので、私はただの -lNewColor を与える必要があります。新しいライブラリのサイズは、最小すなわちそれは、のlibColor.a のなどで使用されていません。のlibRGB.a の中の任意の記号を含めることはできませんする必要があります 私は(静的ライブラリ/アーカイブを作成し、更新するために使用)の AR のコマンドで様々なオプションを使用して私の運を試してみました。

役に立ちましたか?

解決

1 /(arを使用して)各ライブラリからオブジェクトファイルをすべて抽出し、ライブラリまたはオブジェクトファイルのいずれかなしに、あなたのコードをコンパイルしてみてください。おそらく、未定義のシンボルの絶対バケツ負荷を取得します。あなたは未定義のシンボルを取得していない場合は、手順5に進みます。

2 /グラブ最初のシンボル(nmを使用して)ファイルを満たすどのオブジェクトを見つける。

3 /その後、新しいオブジェクトファイルを含め、あなたのコードをコンパイルし、そのオブジェクトファイルを書き留めます。あなたは、手順5に進み、何もありません場合は、未定義のシンボルの新しいリストを取得したりします。

4月2日に進みます。

5 /(再びar付き)1つのライブラリに(もしあれば)あなたのリスト内のすべてのオブジェクトファイルを結合します。

バン!そこには、それを持っています。新しいライブラリのとのオブジェクトのいずれかなしに、あなたのコードをリンクしてみますけど。

この全体のことは、比較的容易にシェルスクリプトで自動化することができます。

他のヒント

GNUアーカイバの少し使用される特徴は、アーカイブスクリプトで、それはシンプルだが強力なインターフェースで、次のスクリプトをscript.ar呼び出された場合には、例えば、正確に何をしたい行うことができます:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END
次のように

次に、あなたは、ARを呼び出すことができます:

ar -M < script.ar

あなたはlibColor.a libRGB.aとlibPixel.aから.oファイルのすべてが含まれていることlibNewColor.aになるだろう。

また、あなたもADDMODコマンドでだけでなく、通常の.oファイルを追加することができます:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

さらに、Makefileの中でこれらのスクリプトを生成する超簡単ですので、私は通常、実際にスクリプトを生成し、スクリプトの上にARを呼び出してアーカイブを作成するための、やや一般的なメイクファイルルールを作成します。このような何かます:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

今、私はそれを見ていることを私は$(OBJECTS)が空の場合、それが動作しないと思います(つまり、あなただけの余分なオブジェクトファイルを追加せずにアーカイブを結合する場合)が、私は読者の練習としてそれを残すだろうけど必要に応じて、その問題を解決するには...:D

ここでは、この機能のためのドキュメントがあります:

https://sourceware.org/binutils/docs/binutils/ar-scripts .htmlを#のAR-スクリプト

静的ライブラリは、いくつかのオブジェクトファイル(.o)はのアーカイブよりもはるかにではありません。あなたにできることは(「AR X」を使用して)2つのライブラリー内のすべてのオブジェクトを抽出し、新しいライブラリにそれらを一緒にリンクする「AR」を使用している。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top