【问题标题】:"one or more multiply defined symbols found" error when compiling编译时出现“发现一个或多个多重定义的符号”错误
【发布时间】:2012-11-21 15:04:50
【问题描述】:

在构建时遇到以下错误:

错误 5 错误 LNK2005: "int __cdecl numGen(void)" (?numGen@@YAHXZ) 已在 main.obj 中定义 错误 6 错误 LNK1169:找到一个或多个多重定义的符号

numGen.cc:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

main.cc:

#include <iostream>
#include "NumGen.cc"

int main()
{
    std::cout << numGen();
    return 0;
}

【问题讨论】:

  • 你为什么要#include一个源文件?
  • @GManNickG 这就是函数的所在......
  • 您使用什么命令/make 文件进行编译?可以发一下标题吗

标签: c++


【解决方案1】:

您不应在其他 C++ 文件中包含 C++ 文件。这导致双重定义的符号。相反,您应该创建一个带有前向声明的头文件,将其包含在共享该函数的两个文件中,然后分别编译这些文件:

numGen.h:

int numGen();

在两个cc 文件中包含numGen.h,并删除#include "NumGen.cc"

【讨论】:

    【解决方案2】:

    通过#includeing NumGen.cc 在您的main.cc 文件中,您导致预处理器创建两个文件,如下所示:

    NumGen.cc:

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int numGen()
    {
        int rNum;
        srand(time(NULL)); //--Seeds a random number.
        rNum = 1 + (rand() % 100);
    
        return rNum;
    }
    

    main.cc:

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int numGen()
    {
        int rNum;
        srand(time(NULL)); //--Seeds a random number.
        rNum = 1 + (rand() % 100);
    
        return rNum;
    }
    
    int main()
    {
        std::cout << numGen();
        return 0;
    }
    

    因为#include 预处理器指令只是将您包含的文件的内容插入到包含它的位置(当然,除非它之前已包含并包含在包含保护中。我还假设您正在编译NumGen.ccmain.cc 在同一个命令行上,所以很自然你会得到一个多重定义的符号错误,因为函数 numGen 现在在两个文件中都定义和实现了。

    你要做的就是在一个头文件中前向声明numGen,我们称之为NumGen.h

    int numGen();
    

    然后将#include "NumGen.h" 行放入NumGen.ccmain.cc

    【讨论】:

      【解决方案3】:

      您正在包含 cc 文件。只包含实际的标题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        相关资源
        最近更新 更多