错误LNK2005:" int __cdecl number(void)" (?number @@ YAHXZ)已在functions.obj中定义

时间:2013-08-02 16:05:40

标签: c++ include

我认为我遇到类似LNK2005, LNK1169 errors, "int __cdecl g(void)" (?g@@YAHXZ) already defined的问题,但我找不到问题。

我正在使用Visual Basic,我有以下文件

的main.cpp

#include <iostream>
#include "functions.h"
using namespace std;

int main(){
    number();
    return 0;
}

我有一个functions.cpp,但是在我将其重新命名为 functions.h

之前,我已经将其链接起来了
int number(){
    int i = 1;
    return i;
}

现在显示error LNK2005: "int __cdecl number(void)" (?number@@YAHXZ) already defined in functions.obj

number()中的函数functions.h是否有任何问题?

3 个答案:

答案 0 :(得分:3)

您正在处理链接问题。

您的直接问题是,functions.obj包含正在链接的代码。然后您在number()中重新定义main.cpp,以便它们发生冲突。继续清理项目(应该删除functions.obj,你应该能够编译。但是,我建议这样做。

functions.hpp (或functions.h)

int number();

<强> functions.cpp

int number(){
    int i = 1;
    return i;
}

<强>的main.cpp

#include <iostream>
#include "functions.h"
using namespace std;

int main(){
    number();
    return 0;
}

编译时,程序将创建2个编译代码为functions.objmain.obj的对象。由于您在主文件中使用number,因此编译器会查找该函数的实现。由于该函数的实现位于functions.obj对象中,因此您需要将其链接到。

如果您要在多个C ++文件中使用 number() ,那么您应该始终将代码分离到自己的文件和实现中。

答案 1 :(得分:2)

functions.h应该只声明函数,如

int number();

然后functions.cpp应该包含函数定义

int number(){
    int i = 1;
    return i;
}

当然,需要编译functions.cpp(将其添加到项目中)。

这里的问题是你在多个文件中包含functions.h。通过简单地将函数static声明为

,也可以避免这个问题
static int number(){
    int i = 1;
    return i;
}

但是,由于您似乎只是在学习,我建议您学习编译c ++代码的基础知识。

答案 2 :(得分:0)

在您链接的其中一个模块中,有一个名为number()的函数。您定义了自己的实现,因此链接器不知道要使用哪个。

重命名您的函数或使用名称空间。