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?
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
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
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