オブジェクト ファイルと既存のスタティック ライブラリを含む単一のスタティック ライブラリを作成しようとしていますが、これらはすべてビルド プロセスの初期段階でコンパイルされています。「ar」を使用してこれを行う簡単な方法はありますか、または各ライブラリを展開 (ar x library_name) し、そのオブジェクト ファイルを統合ライブラリに追加する必要がありますか?
3 に答える
共有ライブラリを作成したい場合は、これを使用できます。
ldから--whole-archiveフラグを使用できます。
--whole-archive
--whole-archive オプションの後にコマンド ラインで指定された各アーカイブについて、必要なオブジェクト ファイルのアーカイブを検索するのではなく、アーカイブ内のすべてのオブジェクト ファイルをリンクに含めます。これは通常、アーカイブ ファイルを共有ライブラリに変換するために使用され、結果の共有ライブラリにすべてのオブジェクトが含まれるように強制します。このオプションは複数回使用できます。gcc からこのオプションを使用する場合の 2 つの注意点: まず、gcc はこのオプションを認識しないため、-Wl,-whole-archive を使用する必要があります。次に、アーカイブのリストの後に -Wl,-no-whole-archive を使用することを忘れないでください。これは、gcc が独自のアーカイブのリストをリンクに追加し、このフラグがアーカイブに影響を与えたくない場合があるためです。
静的ライブラリの場合、最初にオブジェクトを抽出する必要がある場合があります。
私はarのために以下を見つけました
gnu ar は、必要に応じてシン アーカイブを作成できます。シン アーカイブには、シンボル インデックスと、アーカイブのメンバー ファイルの元のコピーへの参照が含まれます。このようなアーカイブは、ローカル ビルド内で使用するためのライブラリを構築するのに役立ちます。この場合、再配置可能なオブジェクトが引き続き使用可能であることが期待され、各オブジェクトの内容をコピーしても時間とスペースが無駄になるだけです。シン アーカイブもフラット化されるため、シン アーカイブに 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
ただし、obj1.o および obj2.o から API を呼び出すようにビルドする必要があります。その後、個々のアーカイブからオブジェクト ファイルを抽出する必要はありません。
それが役に立てば幸い!
他のライブラリからオブジェクト ファイルを抽出し、抽出したオブジェクト ファイルを複合ライブラリにバンドルする必要があります。
増分ロードも検討してください。ld -r