2

我想我遇到了与LNK2005 类似的问题,LNK1169 错误,“int __cdecl g(void)”(?g@@YAHXZ) 已经定义但我找不到问题。

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

主文件

#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吗?

4

3 回答 3

5

您遇到链接问题。

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

函数.hpp(或函数.h)

int number();

函数.cpp

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

主文件

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

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

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

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

于 2013-08-02T16:10:19.593 回答
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++ 代码的基础知识。

于 2013-08-02T16:09:33.620 回答
0

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

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

于 2013-08-02T16:11:20.193 回答