我来为您详细讲解如何解决“关于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++程序时,我们要注意变量和函数的命名规范,避免出现符号重定义的问题。
希望这篇攻略能够帮到你,如果还有其他问题,请及时联系我。