私のチームのプロジェクトがどのように開発されたのか、すべての私たちの.o
オブジェクトファイルから私たちのアプリケーション用の共有オブジェクトライブラリを生成します。私の仕事は(うまくいけば十分ですが、他の人には使えるほど一般的です)、実行ファイルが最後に作成されてから変更されたオブジェクトファイルだけをリンクすることです。たとえば、.soをビルドするために使用するコマンドラインは次のとおりです。Linux上でgccを使用したインクリメンタルリンク。出来ますか?
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
予想どおり動作します。 :)私の目標は、今から変更されたオブジェクトファイルだけにリンクすることができるようにすることです。コマンド例は次のようになります。また、libMySharedLibrary.so
に古いオブジェクトファイルを維持しながら、新しいオブジェクトファイルとlibMySharedLibrary.so
を更新してしまう
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
。実際には、上記のコマンドを使用してlibMySharedLibrary.so
を生成すると、ファイルサイズはすべてのオブジェクトファイルが含まれている場合よりもはるかに小さいので、上記のコマンドが私が望んでいないことをほとんど確信できます。
私の研究では、-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
を作成するので、私はおそらくすべてのオブジェクトファイルを持つことができないと仮定しています。私はこれが少し間違っている可能性が高いと感じています。誰でも助言がありますか?前もって感謝します。
リンクフェーズは実際にインクリメンタルビルドを支配していますか?そうでなければ、なぜ気になるのですか? – dmckee
'-i' /' -r'で試したことを私たちに見せてもらえますか?それはあなたが望むオプションだと思っていますが、シンボルの競合に遭遇することを期待しています( 'replace'オプションはないと考えています)。 –
リンクフェーズは、ビルドで最も時間のかかる部分ではありません。しかし、これは私のチームリーダーが私に与えた仕事です。私たちはすでに変更されたものだけをコンパイルするだけで良いです。現時点では、変更されたものだけをコンパイルし、毎回すべてのオブジェクトファイルを再リンクします。 –