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


von Mark .. (mork)


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
1
d:/programme/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3\libgui.a(window.o): In function `Window::Paint()':
2
window.cpp:(.text+0x6d8): multiple definition of `Window::Paint()'
3
obj\Release\server_window.o:server_window.cpp:(.text+0x12c): first defined here

MfG Mark

von Johann L. (gjlayde) Benutzerseite


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

von Mark .. (mork)


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

von Johann L. (gjlayde) Benutzerseite


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

von Mark .. (mork)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Mark .. (mork)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.