【问题标题】:multiple definition linker error after adding a function to a previously linking file将函数添加到以前的链接文件后出现多定义链接器错误
【发布时间】:2011-03-09 08:59:09
【问题描述】:

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

#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 中,但仍然无法正常工作。我非常困惑。为什么添加一个简单的函数会搞砸链接器?

【问题讨论】:

    标签: c++ linker-errors multiple-definition-error


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果你的意思是声明为inline bool isVowel(const char c),我试过了,没有骰子。我也试过把定义放到实现文件里,还是不行。
    • 假设您在尝试这两个操作时没有犯任何错误,那么您可能正在复制 isVowel。您是否对所有来源进行了全球搜索?
    • 从头开始。它以前不起作用,因为当我重新编译它时,makefile 没有重新编译头文件。删除所有目标文件并重新编译使其注意到内联声明。感谢您的帮助。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多