2017-02-16 5 views
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がfoobarの両方を呼び出す場合は、foobar.oをlibfb.aとともに使用します。

弱い記号や弱いエイリアスを使用していましたが、機能しませんでした。おそらくそれは不可能です。どのようにそれを行うことができます任意のアイデア?

+0

これは不可能です。シンボルを相互に定義することはできません(例えば、 'prog.c'が*両方のシンボルを使用するときにリンクを変更するなど)。 さらに、静的ライブラリはアーカイブ内の '.o'ファイルコレクションです(https://en.wikipedia.org/wiki/Ar_(Unix))。 –

+0

@A.Monti:弱いエイリアスを使用し、.oファイルで.oファイルを適切に順序付けすることで、foo.cとfoobar.c(bar.cなし)のみでこれを解決できます。それが可能であれば、おそらくfoo.c + bar.c + foobar.cも可能です。 – pts

+0

さて、シンボルの弱点を使って優先順位を定義することはできますが、利用可能なプリミティブを使用して "prog.cが** ** fooとbarの両方を呼び出す"ことは検出できません –

答えて

0

回答として@ A.Montiのコメントを繰り返します。

これはできません。 prog.cがfooとbarの両方を呼び出すときは検出できません利用可能なプリミティブを使用します。

関連する問題