www.mikrocontroller.net

Forum: Compiler & IDEs Funktionen aus Object files statt aus Libs bevorzugen


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann man dem Linker mitteilen, dass er bei Funktionen, die sowohl in 
der per Kommandozeile übergebenen .o-Datei als auch in einer 
dazugelinkten .a-Library die Funktion aus der .o nehmen und die aus der 
Lib ignorieren soll?

Bei mir kommt ständig der Fehler
d:/programme/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3\libgui.a(window.o): In function `Window::Paint()':
window.cpp:(.text+0x6d8): multiple definition of `Window::Paint()'
obj\Release\server_window.o:server_window.cpp:(.text+0x12c): first defined here

MfG Mark

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal versuchen __attribute__((weak)) an den lib-Funktionen (C) bzw. .weak 
(asm) wenn das ld-Target elf ist.

Der Compiler bzw. das verwendete GCC-Backend muss weak unterstützen, 
also #define SUPPORTS_WEAK
o.ä. in ./gcc/config/foo.foo.h nebst Implementierung im C-File.

Johann

http://www.google.de/search?q=gnu+ld+weak+funtion

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke für die Hilfe, Johann.

Jetzt meckert der Linker zwar nicht mehr bei Funktionen, dafür aber bei 
der vtable einer Klasse, weil diese ebenfalls doppelt vorhanden ist. 
Wenn man die Klasse selbst mit __attribute__((weak)) versieht, ändert 
sich nichts.

Gibt es eine Möglichkeit, auch die vtable 'weak' zu machen?

MfG Mark

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm

mich dünkt das geht hier in die falsche Richtung --> Hack.

Warum nicht einfach die Klasse aus der Lib ableiten und die Funktionen 
überschreiben, die nicht das machen, was sie sollen.

Über die gcc-Innereien von vtable kann ich auch net weiterhelfen, evtl 
nach .gnu.linkonce.* per ld-Skript. Sieht aber wie gesagt nach Hack aus.

Johann

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Klasse abzuleiten ist eine ziemlich gute Idee, zudem es genau das 
macht, was ich brauche. Manachmal sieht man eben den Wald vor lauter 
Bäumen nicht mehr ;)

Vielen Dank!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark P. schrieb:

> wie kann man dem Linker mitteilen, dass er bei Funktionen, die sowohl in
> der per Kommandozeile übergebenen .o-Datei als auch in einer
> dazugelinkten .a-Library die Funktion aus der .o nehmen und die aus der
> Lib ignorieren soll?

Genau das macht der Linker übrigens.  Allerdings musst du natürlich
zuerst alle .o-Dateien auf der Kommandozeile angeben, erst danach
irgendwelche Bibliotheken.  Andernfalls könnte es passieren, dass er
schon Module aus Bibliotheken entnimmt, um andere Referenzen
aufzulösen, bevor er mit der Verarbeitung aller .o-Dateien fertig
ist.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg

In bei mir wird die Lib als letztes übergeben, also nach allen 
.o-Dateien.

>Andernfalls könnte es passieren, dass er
>schon Module aus Bibliotheken entnimmt, um andere Referenzen
>aufzulösen, bevor er mit der Verarbeitung aller .o-Dateien fertig
>ist.

Ich glaub genau das ist der Fall. Die meisten Funktionen aus den 
Object-Files werwenden Funktionen aus der Lib.

Ist jetzt aber eh egal, da die Ableitung der Klasse einen viel 
eleganteren Weg darstellt.

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.