質問

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

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ファイルを更新できれば、それは素晴らしいことです。結局のところ、最初に作成された後、私はこのコマンドを試しました: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, 、しかし、それはまたはるかに小さい(ファイルサイズで)作成されます AllMyObjects.o, 、ですから、すべてのオブジェクトファイルを持つことができないと思います。これは私が小さな間違いを犯している可能性が高いと思います。誰かがアドバイスをしていますか?前もって感謝します。

役に立ちましたか?

解決

あなたは正しいようです -shared-r 一緒に働いていません。私はあなたの古いGCCバージョンについて懐疑的でしたが、Ubuntu 10.10でも同じことを見ることができます:

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

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

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

それ以外の場合は、さまざまなリンカーまたはコンパイラスイートを見る必要があります。ただし、この機能を見つけることを保証することはできませんが、エキゾチックのようです。

他のヒント

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

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

# 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 以前と同じように。

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