2010-06-28 9 views
6

Also mein Programm funktioniert gut. Kompilieren, Verknüpfen, Ausführen, Arbeiten. Dann entscheide ich, eine einfache Funktion zu einer meiner Dateien hinzuzufügen, wie folgt aus:mehrere Definition Linker Fehler nach dem Hinzufügen einer Funktion zu einer zuvor verknüpften Datei

#ifndef UTILITY_HPP 
#define UTILITY_HPP 

/* #includes here. There's no circular include, I've checked. */ 

namespace yarl 
{ 
    namespace utility 
    { 
     (several function declarations and definitions) 

     bool isVowel(const char c) 
     { 
      if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') 
       return true; 
      else return false; 
     } 
    } 
} 

#endif 

Diese Funktion Definition ist die einzige Änderung, die ich auf meinen Code gemacht habe. Alles andere ist genauso wie zuvor. Nichts ruft es noch an. Ich kompilieren, und es nicht zu verknüpfen, mit g ++ für jede Datei einer dieser Fehler geben, die #include diese:

./obj/Feature.o: In function `yarl::utility::isVowel(char)': 
/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src/Utility.hpp:130: multiple  definition of `yarl::utility::isVowel(char)' 
./obj/Events.o:/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src /Utility.hpp:130: first defined here 
./obj/GameData.o: In function `yarl::utility::isVowel(char)': 

Wenn ich isVowel Kommentar aus, es funktioniert wieder. Ich habe versucht, es umzubenennen, funktioniert immer noch nicht. Ich habe versucht, es mit nur void randomFunctionName() {} zu ersetzen, funktioniert immer noch nicht. Ich habe versucht, es non-inline zu machen und den Funktionskörper in Utility.cpp zu setzen, funktioniert immer noch nicht. Ich bin extrem verwirrt. Warum würde das Addieren einer einfachen Funktion den Linker vermasseln?

Antwort

14

Deklarieren Sie die Funktion entweder inline oder definieren Sie sie in einer separaten CPP-Datei. Andernfalls versucht jede C++ - Datei, in die Sie den Header einfügen, eine eigene, öffentlich verfügbare Definition der Funktion zu erstellen.

Edit: und fwiw, Sie müssen nicht explizit True oder False zurückgeben, wenn Sie eine Bedingung testen. Geben Sie einfach die Bedingung selbst zurück:

+0

wenn Sie es als 'Inline-Bool isVowel (const char c)' deklarieren bedeutet, habe ich das versucht, und keine Würfel. Ich habe auch versucht, die Definition in die Implementierungsdatei zu setzen und funktioniert immer noch nicht. – Max

+0

Vorausgesetzt, Sie haben keine Fehler gemacht, wenn Sie diese beiden Dinge ausprobiert haben, dann haben Sie vielleicht isVowel duplizieren. Haben Sie eine globale Suche in all Ihren Quellen durchgeführt? – Cogwheel

+2

Scratch das. Es hat vorher nicht funktioniert, denn als ich es neu kompiliert habe, hat das Makefile den Header nicht neu kompiliert. Durch das Löschen aller Objektdateien und das erneute Kompilieren wurde die Inline-Deklaration bemerkt. Danke für Ihre Hilfe. – Max

Verwandte Themen