Verwenden Sie C-Funktion in C++ - Programms; "multiply-defined" - Fehler
Ich versuche, mit dieser code für das Porter-stemming-Algorithmus in einem C++ - Programm habe ich bereits geschrieben. Ich folgte den Anweisungen in der Nähe des Ende der Datei mit dem code, als separates Modul. Ich habe eine Datei, Stiel.c, das endet nach der definition und hat
extern int stem(char * p, int i, int j) ...
Lief es in Xcode, aber es funktioniert nicht für mich auf Unix mit gcc 4.1.1--seltsam, denn normalerweise habe ich kein problem, bewegen Sie sich zwischen die beiden. Ich bekomme die Fehlermeldung
ld: fatal: symbol `stem(char*, int, int)' ist mehrfach definiert:
(Datei /var/tmp//ccrWWlnb.o-Typ=FUNC; Datei /var/tmp//cc6rUXka.o-Typ=FUNC);
ld: fatal: File Verarbeitung von Fehlern. Keine Ausgabe geschrieben cluster
Habe ich online geschaut, und es scheint, wie es gibt viele Dinge, die ich könnte falsch liegen, aber ich bin mir nicht sicher, welche Kombination aus einer header-Datei extern "C" usw.. funktionieren würde.
- Sind Sie irgendwie #einbauen ' Ing, dass die C-Datei in andere Dateien ? Was ist der Befehl Linien, die Sie verwenden, um Compiler - /link-Ihr Programm ?
- Ja, in einer Funktion ist .cpp-Datei habe ich #include "stammen.c". Kompilieren mit g++ Whatever.cpp Anotherthing.cpp Stamm.c -o myprogram.
- Nun, es ist Ihr problem! Übrigens, dies hat nichts zu tun mit dem mischen von C und C++. Das gleiche würde passieren, wenn Sie hatte
#include
ed ein .cpp-Datei in eine andere.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler bedeutet, dass das symbol (stem) ist definiert in mehr als einem Modul.
Können Sie erklären das symbol in so viele Module wie Sie möchten. Ein Erklärung einer Funktion sieht wie folgt aus:
Brauchen Sie nicht, die "extern" Schlüsselwort, obwohl es tut nicht weh, nichts. Für die Funktionen, Deklarationen, es ist implizit.
Einen definition einer Funktion sieht wie folgt aus:
Den "multiply-defined" - Fehler zeigt an, dass Sie zwei Module mit einem definition für die gleiche Funktion. Das bedeutet in der Regel, dass Sie haben zwei Dateien, definieren Sie die Funktion, oder zwei Dateien, #include eine Datei, die definiert die Funktion. Normalerweise sollten Sie nicht die Funktion von Definitionen in Dateien, die Sie #include. Setzen Sie die definition in einem .c, .cpp, oder .cc-Datei und legen Sie einfach eine Erklärung in einem .h-Datei, die Sie #include.
Zum Beispiel, Sie könnte einen Vorbau.h die Datei mit diesem an:
Dann
#include "stem.h"
.Die Tatsache, dass Whatever.cpp hat #include "stammen.c" stellt die erste definition und die Angabe Vorbau.c auf der compiler-Kommandozeile stellt die zweite definition.
Sollten Sie brechen Stamm.c in eine header-Datei (nur Mit Funktionsprototypen) und eine .c-Datei enthält die Implementierung. Nur die header-Datei in Whatever.cpp
Müssen Sie "C". Sie müssen extern "C" { ... } und nur tatsächlich definieren die Funktion einmal. Aber man kann es erklären (der Prototyp) so oft, wie Sie möchten.
extern "C"
wenn Sie eine C++ Funktion aufgerufen werden können, die aus C-code. In diesem Fall, es anders herum, und eine C-Funktion aufgerufen wird, von C++ - code.