编译时“发现一个或多个多重定义的符号”错误

时间:2012-12-04 02:40:48

标签: c++

构建时遇到这些错误:

  

错误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;
}

3 个答案:

答案 0 :(得分:5)

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

numGen.h:

int numGen();

numGen.h个文件中加入cc,然后移除#include "NumGen.cc"

答案 1 :(得分:3)

通过#include文件中的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中。

答案 2 :(得分:1)

您要包含cc文件。仅包含实际标题