私はmain()
の前に実行する必要があるいくつかの静的初期化コードを含むこのライブラリを持っています。すべての翻訳単位をまとめてコンパイルするだけではうまくいきますが、静的ライブラリ(.a
ファイル)を提供し、ユーザーがアプリケーションにリンクしても機能しません。つまり、リンカーは自分の静的な初期化。私は、すなわちGNUリンクに--whole-archive
オプションを指定して、GCCに-Wl,--whole-archive
オプションを指定した場合、リンカは、静的ライブラリにすべてを拾うことができますYリンクするとき、「必要なものをつかむ」と「すべてをつかむ」(-Wl、 - 全体アーカイブ)の間に何かがありますか?
オルタナティブ、。
しかし、中には何かがありますか?いくつかのシンボルをマークして、実行可能ファイルのためにリンカがそれらをピックアップできるようにすることはできますか?残りのシンボルは必要なときにだけ追加されますか?
モチベーション:私は工場でクラスを登録するためにstatic blocksを使用します。私は自分のコードを(非動的な)ライブラリとして利用できるようにしたいのですが、ユーザコードは、そのファクトリが実装されるための "魔法の呪文"を実行する必要はありません。
いくつかの関連質問:
- How to force include static objects from a static library in C++ (MSVC 11)
- How to force gcc to link unreferenced, static C++ objects from a library
- How to force gcc to link an unused static library
(1)この例のどの部分がAndroid専用ですか? GNU ldはこれらのフラグをすべて尊重しますか? (2) 'static'について - ファイルスコープで静的であると宣言しているわけではないのですか?それは実際に私には問題になるでしょう...でも、今は+1してみてください。 – einpoklum
私は** statuc **についての答えを広げました。リンカフラグに関しては、gccベースのツールチェーン上で、私が知る限り利用できます。 Android固有のものは、スタティックライブラリのユーザーにその知識をどのように配布するかです。ヘッダーファイルへのアクセスをどのように手助けしますか?あなたのコードはいくつかのサードパーティ製のライブラリに依存していると教えてくれますか? –