2010-06-28 26 views
6

Quindi il mio programma funziona correttamente. Compilare, collegare, correre, i lavori. Poi, ho deciso di aggiungere una funzione semplice da uno dei miei file, in questo modo:errore di linker a definizione multipla dopo aver aggiunto una funzione a un file di collegamento precedente

#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 

Quella definizione di funzione è l'unico cambiamento che ho fatto per il mio codice. Tutto il resto è esattamente lo stesso di prima. Niente lo chiama ancora. Compilo, e non riesce a collegare, con g ++ dando uno di questi errori per ogni file che #includes questo:

./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)': 

Se io commento isVowel, funziona di nuovo. Ho provato a rinominarlo, ancora non funziona. Ho provato a sostituirlo con solo void randomFunctionName() {}, ancora non funziona. Ho provato a renderlo non in linea e mettere il corpo della funzione in Utility.cpp, continua a non funzionare. Sono estremamente confuso. Perché aggiungere una semplice funzione rovina il linker?

risposta

14

Dichiarare la funzione inline o definirla in un file .cpp separato. In caso contrario, ogni file C++ in cui si include l'intestazione sta tentando di creare la propria definizione della funzione pubblicamente disponibile.

Modifica: e fwow, non è necessario restituire esplicitamente true o false se si verifica un condizionale. Basta restituire la stessa condizionale:

inline bool isVowel(const char c) 
{ 
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'); 
} 
+0

Se vuoi dire dichiarandolo come 'inline bool isVowel (const char c)', ho provato questo, e niente da fare. Ho anche provato a inserire la definizione nel file di implementazione e ancora non funziona. – Max

+0

Supponendo che non hai commesso errori quando hai provato queste due cose, allora forse stai duplicando isVowel. Hai fatto una ricerca globale attraverso tutte le tue fonti? – Cogwheel

+2

Gratta che. Non ha funzionato in precedenza perché quando ho ricompilato il makefile non ha ricompilato l'intestazione. Cancellando tutti i file oggetto e ricompilando fatto notare la dichiarazione in linea. Grazie per l'aiuto. – Max