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%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:
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%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]
habenTags und Links c++ linux linker g++ multiple-definition-error