0
私は静的ライブラリを開発しています(libfb.a)2つの関数の複数の実装を含むファイル:自動選択(.Aファイル)
- foo.cのは
void foo() { ... }
が含まれています。 - bar.cには、
void bar() { ... }
が含まれています。 - foobar.cには、
void foo() { ... }
とvoid bar() { ... }
が含まれています。 FOO両方とバーが必要な場合、それらの両方がお互いを使用して、より効率的に実現することができるので、
すべて3つの実装(...
)は、異なっています。私はGNU ldが自動選択を行うことになるためには.aファイルに.oファイルを結合するにはどうすればよい
、すなわちgcc prog.c libfb.a
意志libfb.a内
- 使用foo.oのprog.cのはFOOを呼び出す場合、但しバー;
- prog.cがbarを呼び出しているのにlibfb.a内でbar.oを使用しますが、fooをコールしないでください。
- prog.cがfooとbarの両方を呼び出す場合は、foobar.oをlibfb.aとともに使用します。
弱い記号や弱いエイリアスを使用していましたが、機能しませんでした。おそらくそれは不可能です。どのようにそれを行うことができます任意のアイデア?
これは不可能です。シンボルを相互に定義することはできません(例えば、 'prog.c'が*両方のシンボルを使用するときにリンクを変更するなど)。 さらに、静的ライブラリはアーカイブ内の '.o'ファイルコレクションです(https://en.wikipedia.org/wiki/Ar_(Unix))。 –
@A.Monti:弱いエイリアスを使用し、.oファイルで.oファイルを適切に順序付けすることで、foo.cとfoobar.c(bar.cなし)のみでこれを解決できます。それが可能であれば、おそらくfoo.c + bar.c + foobar.cも可能です。 – pts
さて、シンボルの弱点を使って優先順位を定義することはできますが、利用可能なプリミティブを使用して "prog.cが** ** fooとbarの両方を呼び出す"ことは検出できません –