2016-12-21 3 views
0

Ich kompilierte eine Bibliothek mit g++ und ich möchte dagegen mit gcc verknüpfen.
Problem ist ich einen Fehler, während dagegen die Verknüpfung:Wie werden umgebende Zeichen um ein Symbol in einer gemeinsam genutzten Bibliothek entfernt?

undefined Verweis auf ‚functionName`

(functionName- ist der Name der Funktion in der Bibliothek)

obwohl die Funktion existiert in der Symbolliste und ich gebe den Pfad zu gcc während der Verknüpfung an.

Es geschieht, weil die Funktion mit umgebenden Zeichen in der Liste angezeigt wird (Ich denke, das für das Überschreiben ist?):

Z12functionNameiSt9__va_list

Ich weiß, dass diese Zeichen entfernen ich die Funktionsdeklaration mit extern "C" umgeben soll . Und ich tat das:

Aber die umgebenden Zeichen erscheinen immer noch um den Funktionsnamen in der Symbolliste. Und deshalb kann gcc es nicht finden.

Ich Kreuzkompilierung für Linux Arm yokto mit arm-poky-linux-gnueabi-gcc und arm-poky-linux-gnueabi-g++ auf Ubuntu Desktop 16.

Warum sind nicht die umliegenden Zeichen entfernt werden und wie kann ich sie entfernen? Ich werde diese Funktion niemals außer Kraft setzen. Wenn diese wirklich zu überschreiben sind, brauche ich sie nicht.


edit:

gelöst. Die Funktionssignatur in ihrer Deklaration unterschied sich von der Signatur in ihrer Definition ... Also war das Schlüsselwort extern umsonst.

int functionName(int argc, ...); //declaration 
int functionName(int argc, va_list args) //definition 
+0

Vielleicht haben Sie vergessen ein # #include ' –

+0

@BasileStarynkevitch - Es ist enthalten –

Antwort

1

Diese Zeichen sind Name Mangling. Sie codieren die Funktionssignatur, so dass C++ - Überladung korrekt funktionieren kann (z. B. int foo(int) und int foo(float) sind unterschiedliche Symbole).

Wenn Ihre API C ist, müssen Sie die Bibliothek reparieren, damit sie nicht beschädigt wird. Erstellen Sie es als C oder fügen Sie in seinem Code extern "C" hinzu. Wenn Ihre API C++ sein soll, entfernen Sie die extern "C" aus Ihrer Kopfzeile.

Wenn die verfälschten Namen nicht übereinstimmen (verschiedene Mangeln), haben Sie wahrscheinlich ein ABI-Kompatibilitätsproblem. In diesem Fall ist der Versuch, das Linkproblem zu beheben, die falsche Lösung. Sie müssen sicherstellen, dass Sie Ihren Code mit demselben ABI wie die Bibliothek erstellen.

Das Tool c++filt sollte in der Lage sein, das verstümmelte Symbol in eine Signatur zu decodieren. Das kann nützlich sein, um herauszufinden, worum es bei dem Unterschied geht.

Da Sie die Bibliothek mit g++ gebaut und versuchen, mit gcc zu verbinden, ist es wahrscheinlich, dass Sie einen C-API wollen und die Bibliothek mit den extern "C" an Ort und Stelle wieder aufzubauen ist, was Sie brauchen.

+0

Die API ist c (keine Klassen), aber die Funktion verwendet C++ - Bibliotheken. Ich habe 'extern' C ''zum Header hinzugefügt (siehe Beitrag), aber es löscht nicht die umgebenden Zeichen. Könnte es sein, weil die Funktionssignatur eine Ellipse ('...') hat? –

+0

@AlaaM. Nein, es funktioniert gut mit Ellipse. Hast du die Bibliothek mit dem 'extern C '' vorhanden? Ich habe aus Ihrem Post verstanden, dass der Linker nach 'functionName' sucht, aber die Bibliothek' Z12functionNameiSt9__va_list' enthält, was bedeutet, dass das Problem bei der Bibliothek liegt. Stellen Sie außerdem sicher, dass die Bibliothek tatsächlich die Kopfzeile enthält und nicht einfach die Funktion ohne "extern" C "definiert. – Olivier

+0

Wie ich in der Post gesagt habe, weiß ich, dass das Problem in der Bibliothek ist. Das Problem ist, dass es immer noch die umgebenden Zeichen –

0

Die "umgebenden Zeichen" sind eigentlich für name mangling. Also sprechen Sie besser von verstümmelten Namen.

Sie sollten wahrscheinlich

#ifdef __cplusplus 
extern "C" { 
#endif 

in der Nähe von Beginn der (öffentlichen) Header-Datei hinzufügen (dass Sie besseren Code in der gemeinsamen Teilmenge von C und C++) und den passenden

#ifdef __cplusplus 
}; // end of extern "C" 
#endif 

gegen Ende. Siehe auch this.

Sie sollten alle Ihre öffentlichen Header (und vielleicht Standard-C-Header von ihm enthalten) mit solchen Dingen (nicht nur einzelne Funktionen).

Sie könnten mit gcc -H kompilieren, um die enthaltenen Header oder g++ -C -E aufzulisten, um die vorverarbeitete Form zu erhalten (und untersuchen).

+0

Ich verstehe nicht, wie ist das anders von dem, was ich erwähnt habe ich getan? Ich habe bereits 'extern" C "hinzugefügt. –

Verwandte Themen