Wie vermeidet man mehrere Definitionsfehler?

8

Neben dem Verschieben der Funktion hello() in eine andere Quelldatei (.cpp) oder Umbenennen der Funktion. Gibt es andere Methoden, um den Verbindungsfehler zu vermeiden?

staticLibA.h

%Vor%

staticLibA.cpp

%Vor%

Ausgabe:

%Vor%

staticLibB.h

%Vor%

staticLibB.cpp

%Vor%

Ausgabe:

%Vor%

main.cpp

%Vor%

Ausgabe:

%Vor%     
ban 11.01.2011, 05:03
quelle

2 Antworten

11

Da Sie scheinen, beide Bibliotheken zu besitzen, ist es unklar, warum Sie die Funktion nicht umbenennen können ...

In Ihrer main haben Sie diese Zeile:

%Vor%

Was erwartest du hier, wenn du den Verknüpfungsfehler weglässt? Soll es die Implementierung in LibA oder LibB aufrufen? Wenn Sie sich auf die Reihenfolge verlassen, in der Sie die Bibliotheken an den Linker übergeben, um festzustellen, welche Funktion verknüpft wird, erscheint dies als sehr schlechte Idee . Was würde in einem realen Beispiel passieren, wenn Ihre Funktion hello_staticLibB_only hello() aufruft? Es könnte am Ende die Version der Funktion aufrufen, die sich in der anderen Bibliothek befindet ...

Da Sie g++ verwenden, sollten Sie in Betracht ziehen, Ihre Bibliotheksfunktionen in namespace zu setzen (sie sollen Ihnen helfen, diesen Namenskonflikt zu vermeiden). Das würde Ihrem Code und dem Linker ermöglichen, den Unterschied zwischen den Methoden zu erkennen.

Wenn Sie diesem Ansatz für LibA folgen, hätten Sie:

staticLibA.h

%Vor%

staticLibA.cpp

%Vor%

main.cpp

%Vor%     
forsvarir 07.06.2011 11:53
quelle
1

Der Verknüpfungsfehler bezieht sich speziell auf Hallo. Dies zeigt sich, weil beide Bibliotheken Definitionen von "Hallo" bereitstellen. Es gibt hier keinen weiteren Verknüpfungsfehler.

Sie können entweder hallo in eine separate Bibliothek einfügen, hello in einer separaten Bibliothek residieren oder einfach die ausführbare Verknüpfung mit einer Hello-Objektdatei [hello.o]

haben     
Foo Bah 04.02.2011 02:15
quelle