ошибка компоновщика нескольких определений после добавления функции в ранее связанный файл - PullRequest
7 голосов
/ 29 июня 2010

Так что моя программа работает нормально.Компиляция, компоновка, запуск, работает.Затем я решаю добавить в один из моих файлов простую функцию, например:

#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

Это определение функции - единственное изменение, которое я внес в свой код.Все остальное точно так же, как и было.Ничто еще не называет это.Я компилирую, и он не может связать, с g ++ выдает одну из следующих ошибок для каждого файла, который #include этот:

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

Если я закомментирую isVowel, он снова работаетЯ пытался переименовать его, все еще не работает.Я пытался заменить его просто void randomFunctionName() {}, все еще не работает.Я пытался сделать его не встроенным и поместить тело функции в Utility.cpp, но все еще не работает.Я очень смущен.Зачем добавлять одну простую функцию, чтобы испортить компоновщик?

1 Ответ

17 голосов
/ 29 июня 2010

Либо объявите встроенную функцию, либо определите ее в отдельном файле .cpp.В противном случае каждый файл C ++, в который вы включаете заголовок, пытается создать собственное общедоступное определение функции.

Edit: и fwiw, вам не нужно явно возвращать true или false, еслиповторное тестирование условно.Просто верните само условие:

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