Tak więc mój program działa poprawnie. Kompilowanie, łączenie, uruchamianie, prace. Potem zdecydujesz się dodać prostą funkcję do jednego z moich plików, na przykład:błąd wielokrotnej definicji łącza po dodaniu funkcji do wcześniejszego pliku łączącego
#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
Definicja ta funkcja jest tylko zmiana zrobiłem do mojego kodu. Wszystko inne jest dokładnie takie, jak było. Nic jeszcze tego nie nazywa. Skompilować, a nie odwołuje, z g ++ daje jeden z tych błędów dla każdego pliku, który właczoną to jedno:
./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)':
Gdybym wykomentuj isVowel
, to działa ponownie. Próbowałem zmienić nazwę, nadal nie działa. Próbowałem zastąpienie go tylko void randomFunctionName() {}
, nadal nie działa. Próbowałem uczynić go nieinterline i umieszczanie body funkcji w Utility.cpp, nadal nie działa. Jestem bardzo zdezorientowany. Dlaczego dodanie jednej prostej funkcji spowoduje zepsucie linkera?
Jeśli masz na myśli deklarując je jako 'isVowel inline bool (const char c)', próbowałem to i nie ma kości. Próbowałem również umieścić definicję w pliku implementacji i nadal nie działa. – Max
Zakładając, że nie popełniłeś żadnych błędów, gdy próbowałeś tych dwóch rzeczy, to może TYLKO duplikujesz toVowel. Czy dokonałeś globalnego wyszukiwania we wszystkich swoich źródłach? – Cogwheel
Zdrap to. Nie działało to wcześniej, ponieważ po ponownym skompilowaniu makefile nie rekompilował nagłówka. Usunięcie wszystkich plików obiektów i rekompilacja sprawiło, że zauważyło deklarację śródliniową. Dzięki za pomoc. – Max