将函数添加到先前链接文件后出现多个定义链接器错误

Max*_*Max 9 c++ linker-errors multiple-definition-error

所以我的程序运行正常.编译,链接,运行,工作.然后,我决定在我的一个文件中添加一个简单的函数,如下所示:

#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
Run Code Online (Sandbox Code Playgroud)

该函数定义是我对代码所做的唯一更改.其他一切与现在完全一样.什么都没有叫它.我编译,它无法链接,g ++为#includes这个文件的每个文件提供了这些错误之一:

./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)':
Run Code Online (Sandbox Code Playgroud)

如果我发表评论isVowel,它会再次发挥作用.我已经尝试重命名它,仍然无法正常工作.我试过用它替换它void randomFunctionName() {},仍然无法正常工作.我试过让它非内联并将函数体放在Utility.cpp中,仍然无法正常工作.我非常困惑.为什么添加一个简单的函数会搞砸链接器?

Cog*_*eel 20

声明函数内联,或在单独的.cpp文件中定义它.否则,您在其中包含标头的每个C++文件都会尝试创建自己的,公开可用的函数定义.

编辑:和fwiw,如果您正在测试条件,则不需要显式返回true或false.只需返回条件本身:

inline bool isVowel(const char c)
{
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}
Run Code Online (Sandbox Code Playgroud)

  • 抓一点.它之前没有用,因为当我重新编译它时,makefile没有重新编译头文件.删除所有目标文件并重新编译使它注意到内联声明.谢谢你的帮助. (2认同)