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

标签 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

该函数定义是我对代码所做的唯一更改。其他一切都和原来完全一样。还没有什么叫它。我编译,但它无法链接,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)':

如果我注释掉 isVowel,它会再次起作用。我试过重命名它,仍然不起作用。我已经尝试用 void randomFunctionName() {} 替换它,但仍然不起作用。我试过使其成为非内联并将函数体放入 Utility.cpp 中,但仍然不起作用。我非常困惑。为什么添加一个简单的函数会搞砸链接器?

最佳答案

要么声明内联函数,要么在单独的 .cpp 文件中定义它。否则,包含 header 的每个 C++ 文件都会尝试创建自己的、公开可用的函数定义。

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

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

关于c++ - 将函数添加到先前链接的文件后出现多定义链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136616/

相关文章:

C++ Map 具有两个不同值的键

c++ - size_t 类型变量的跨平台格式字符串?

c - ld : undefined reference to symbol 'log2@@GLIBC_2.2.5'

qt4 - 多重定义错误 : one in my file and one in the moc file.

c - 奇数 "undefined reference"错误

c++ - 使用 boost::interprocess 编译链接器错误

c - 我对声明和定义的理解是否正确?

c++ - 使用xerces C++解析xml文件

C++ 字符串 char** 翻译

C++11 自动转换