20

私のチームのプロジェクトの開発方法では、すべての.oオブジェクト ファイルからアプリケーション用の共有オブジェクト ライブラリを生成します。私の仕事 (うまくいけば、それは十分に具体的であると同時に、他の人に役立つほど一般的でもあります!) は、実行可能ファイルが最後に作成されてから変更されたオブジェクト ファイルのみをリンクすることです。たとえば、.so のビルドに使用するコマンド ラインは次のとおりです。

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

これは期待どおりに機能します。:)私の目標は、変更されたオブジェクトファイルのみをリンクできるようにして、同時リンクプロセスを高速化することです。コマンドの例は次のとおりです。

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

libMySharedLibrary.so古いオブジェクトファイルも維持しながら、新しいオブジェクトファイルで更新されますlibMySharedLibrary.so。実際、libMySharedLibrary.so上記のコマンドで生成すると、すべてのオブジェクト ファイルが含まれている場合よりもファイル サイズが大幅に小さくなっているため、上記のコマンドが意図したとおりに実行されていないことはほぼ確実です。

私の調査を通じて、-iオプションと同じリンカのオプションがあることがわかりました。これは、-rすべてのオブジェクト ファイルを 1 つの大きなオブジェクト ファイルに結合するだけのように見えます。残念ながら、これが私が望むものではないようです。

要するに、最初のリンク後に変更されたオブジェクト ファイルのみをリンクして、将来のリンクのリンク プロセスを高速化したいと考えています。これを行う方法はありますか?

編集:私が試したものの例-i/-r:

コマンド例:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

-nostdlibタグが必要だと叫ぶのを止めるためにタグを追加する必要があり、-shared共有オブジェクトは-rタグで許可されていないため削除しました。

このコマンドは、すべての .o ファイルを 1 つの大きな .o ファイルにまとめるように見えます。したがって、変更された .o ファイルのみを使用して、これからその .o ファイルを更新できれば、それは素晴らしいことです。AllMyObjects.o が最初に作成された後、次のコマンドを試しましたg++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o: AllMyObjects.oこれは私が小さな間違いを犯している可能性が高いものだと感じています。誰にもアドバイスはありますか?前もって感謝します。

4

2 に答える 2

7

あなたは正しく、一緒に働いていないよう-sharedです-r。古い GCC バージョンについては懐疑的でしたが、Ubuntu 10.10 でも同じことがわかります。

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

残念ながら、共有オブジェクトが絶対に必要な場合、これは行き止まりに達したことを意味します。binutils リンカは単純にそれを実装していません。

静的ライブラリがオプションである場合、それらはarユーティリティで簡単に操作できる単なるアーカイブです。

それ以外の場合は、別のリンカーまたはコンパイラ スイートを調べる必要があります。この機能が見つかるとは限りませんが、エキゾチックなようです。

于 2010-11-22T20:22:12.617 に答える
5

アーカイブ/静的ライブラリを使用した後の動作を取得できますが、最初のリンクには同じ時間がかかります。

アーカイブ ファイルの使用:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

.so私が言ったように、実際にリンクするには以前と同じ時間がかかります。

于 2012-07-03T15:05:25.840 に答える