2017-02-16 1 views
0

ich eine statische Bibliothek (libfb.a-Datei) zu entwickeln, die mehrere Implementierungen von zwei Funktionen:Automatische Auswahl der .o-Datei in statischer Bibliothek (.a-Datei)

  • foo.c enthält void foo() { ... }.
  • bar.c enthält void bar() { ... }.
  • foobar.c enthält void foo() { ... } und void bar() { ... }.

Alle 3-Implementierungen (...) unterschiedlich sind, denn wenn beide foo und bar benötigt werden, können beide effizienter umgesetzt werden, sich gegenseitig mit.

Wie kann ich die .o-Dateien auf eine .a-Datei kombinieren, für die GNU ld automatische Auswahl tun würde, also gcc prog.c libfb.a wird

  • Verwendung foo.o innerhalb libfb.a wenn prog.c ruft foo, aber nicht bar;
  • Verwenden Sie bar.o in libfb.a, wenn prog.c Aufrufe bar, aber nicht foo;
  • Verwenden Sie foobar.o mit libfb.a, wenn prog.c sowohl foo als auch bar aufruft.

Ich habe versucht, es mit schwachen Symbolen und schwachen Aliase zu tun, aber es hat nicht funktioniert. Vielleicht ist es nicht möglich. Irgendwelche Ideen, wie es gemacht werden kann?

+0

dies nicht möglich ist, kann man nicht Symbole in Bezug zueinander definieren (beispielsweise die Verknüpfung ändern, wenn 'prog.c' verwendet * beide * Symbole). Außerdem ist eine statische Bibliothek nur eine '.o' Dateisammlung [in einem Archiv] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+0

@ A.Monti: Es ist in der Tat möglich, dies mit nur foo.c und foobar.c (kein bar.c) mit schwacher Aliase und die richtige Reihenfolge der .o Dateien mit der .a-Datei zu lösen. Wenn das möglich ist, dann ist vielleicht auch foo.c + bar.c + foobar.c möglich. – pts

+0

Nun, in der Tat können Sie die Symbolschwäche verwenden, um Prioritäten zu definieren, aber Sie können einfach nicht erkennen, wenn "prog.c ** ** ** foo und bar" aufruft, indem Sie die verfügbaren Primitive verwenden –

Antwort

0

Wiederholung @ A.Monti Kommentar als Antwort.

Es ist nicht möglich. Sie können nicht erkennen, wenn prog.c sowohl foo als auch bar mit den verfügbaren Primitiven aufruft.

Verwandte Themen