プロジェクトに10個のリンクライブラリを追加したり、自分のプロジェクトを使用するために8個のリンクライブラリを要求したりするのにうんざりしています。libpng.a、libz.a、libjpeg.aなどの既存のライブラリを取得し、それらを1つの.aライブラリに結合したいと思います。それは可能ですか?.libライブラリを組み合わせるのはどうですか?
6 に答える
各ライブラリからオブジェクトファイルを抽出するには、
ar x <library name>
次に、それらすべてを新しいライブラリにマージします。
ar cs <new library name> <list each extracted object file>
Unix ライクなシステムでは、ld および ar ユーティリティでこれを行うことができます。http://en.wikipedia.org/wiki/Ar_(Unix)を確認するか、任意の Linux ボックスまたは Google で man ページを参照してください (「unix man ar」など)。
共有 (動的) ライブラリにリンクした方がよい場合があることに注意してください。これにより、実行可能ファイルに依存関係が追加されますが、特にグラフィック アプリケーションを作成している場合は、そのサイズが大幅に縮小されます。
Linux または MinGW または Cygwin で、GNU ツールチェーンを使用する場合:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
liba.a
または、 andの存在を維持できる場合libb.a
:
ar crsT libab.a liba.a libb.a
Windows で MSVC ツールチェーンを使用する場合:
lib.exe /OUT:libab.lib liba.lib libb.lib
それらを物理的に1つのファイルに結合する方法はわかりませんが、ある種の抽象化を使用して、必要なものすべてを含む単一の「AllMyLibs.a/h」を含めることができます。これをコンパイラがライブラリを検索する場所に配置することもできるので、どのプロジェクトでも機能します。
PS-好奇心から、なぜ単一のライブラリを含めるのが嫌いなのですか?
誤解しているかもしれませんが、エンドユーザーのコードがライブラリを直接呼び出す場合にのみ、ライブラリを出荷する必要があるのではないでしょうか? Jpeg メソッドなどへのすべてのアクセスが静的ライブラリ内のコードからのものである場合は、ライブラリをライブラリにリンクするだけです。
いえ
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
つまり、終了コードが libz.a、libpng.a などを直接呼び出す必要がある場合にのみ問題になります。
たとえば、アプリ コードで libz.a を呼び出す正当な必要性がある場合は、前述のように動的モジュールを使用するケースになります。
PS: アーティスト バッジはもらえますか? :)
複数のサードパーティ ライブラリを 1 つに結合すると、さらに問題が発生する可能性があります。たとえば、これらのライブラリのうちの 2 つが、プログラムで使用しない共通のシンボルを定義している場合などです。ライブラリを結合する前に、共通シンボルのすべてのインスタンス (または 1 つを除くすべて) を抽出する必要があります。