注册

关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法

我来为您详细讲解如何解决“关于VS2019 C++项目同时出现LNK2005和LNK1169 error”的问题。

问题描述

当我们在使用Visual Studio 2019创建C++项目时,有时候会出现LNK2005和LNK1169错误,错误提示信息大致如下:

1>First.obj : error LNK2005: "int num" (?num@@3HA) already defined in main.obj
1>D:\C++ Project\Debug\MFC Application5.exe : fatal error LNK1169: one or more multiply defined symbols found

这种错误主要是由于C++编译器出现了符号重定义导致的,其主要原因是函数或变量被定义了多次,编译器无法确定使用哪一个定义,从而导致了错误。解决这个问题的方法主要有两种。

解决方法一

第一种方法是使用头文件保护。在头文件中使用#ifndef#define来保护变量和函数的定义,保证只被编译一次。以下是一个示例:

  • test.h文件:
#ifndef TEST_H    //如果未定义TEST_H宏,就进行以下操作
#define TEST_H    //将TEST_H宏定义为1

int num = 100;    //声明一个全局变量num

int add(int a, int b);    //声明一个函数add

#endif // !TEST_H  //结束宏定义
  • test.cpp文件:
#include "test.h"

int add(int a, int b)
{
    return a + b;
}
  • main.cpp文件:
#include "test.h"
#include 
using namespace std;

int num = 200;    //再次定义全局变量num

int main()
{
    int sum = add(num, num);
    cout << "sum is: " << sum << endl;

    return 0;
}

在这个例子中,我们在头文件test.h中对全局变量num和函数add进行了定义,在test.cpp文件中对函数add进行了实现。而在main.cpp文件中,我们再次定义了全局变量num,这就导致了符号重定义错误。为了解决这个问题,我们在test.h头文件中加入保护宏定义#ifndef#define,保证了变量和函数的定义只会被编译一次。

解决方法二

第二种方法是将全局变量改为局部变量。在C++中,全局变量可以在任何地方进行访问,但是这样也容易导致符号重定义。为了避免这种问题,我们可以将全局变量改为局部变量。示例代码如下:

  • test.h文件:
int add(int a, int b);    //声明一个函数add
  • test.cpp文件:
#include 
using namespace std;

int add(int a, int b)
{
    int num = 100;    //将全局变量改为局部变量
    return a + b + num;
}
  • main.cpp文件:
#include "test.h"
#include 
using namespace std;

int num = 200;    //全局变量num

int main()
{
    int sum = add(num, num);
    cout << "sum is: " << sum << endl;

    return 0;
}

在这个例子中,我们将全局变量num改为了函数add中的局部变量num,这样就可以避免符号重定义的错误了。

总结

以上就是解决“关于VS2019 C++项目同时出现LNK2005和LNK1169 error”的两种方法,分别是使用头文件保护和将全局变量改为局部变量。在编写C++程序时,我们要注意变量和函数的命名规范,避免出现符号重定义的问题。

希望这篇攻略能够帮到你,如果还有其他问题,请及时联系我。