我认为我遇到类似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
是否有任何问题?
答案 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.obj
和main.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()
的函数。您定义了自己的实现,因此链接器不知道要使用哪个。
重命名您的函数或使用名称空间。