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

yizhihongxing

我来为您详细讲解如何解决“关于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 <iostream>
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 <iostream>
using namespace std;

int add(int a, int b)
{
    int num = 100;    //将全局变量改为局部变量
    return a + b + num;
}
  • main.cpp文件:
#include "test.h"
#include <iostream>
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++程序时,我们要注意变量和函数的命名规范,避免出现符号重定义的问题。

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 详解mongodb 主从配置

    让我为您详细讲解“详解mongodb 主从配置”的完整攻略。 MongoDB主从配置详解 在MongoDB中,主从配置提供了一个高可用性和可扩展性的解决方案。主从复制是指将数据从一个MongoDB服务器同步到其他多个MongoDB服务器。我们可以将主服务器用于写操作,将从服务器用于读取和分担主服务器的读取压力。 步骤 配置主服务器 在主服务器中运行Mongo…

    MongoDB 2023年5月16日
    00
  • java操作mongodb基础(查询 排序 输出list)

    Java操作MongoDB基础 目录 MongoDB入门 Java连接MongoDB MongoDB查询操作 查询所有记录 条件查询 多条件查询 分页查询 MongoDB排序操作 正序排序 倒序排序 Java输出MongoDB查询结果为List MongoDB入门 MongoDB是一种基于文档的、面向文档的NoSQL数据库管理系统。与传统的关系型数据库相比,…

    MongoDB 2023年5月16日
    00
  • MongoDB查询技巧总结

    MongoDB查询技巧总结 MongoDB作为一个NoSQL数据库,在应用程序中得到了广泛的应用。查询是使用MongoDB数据库最常见的操作之一。在这里,我们总结了一些MongoDB查询技巧,希望能够帮助大家更好地使用MongoDB。 1. 使用索引 索引是MongoDB查询中的一个重要组成部分。使用索引可以大幅度提高查询的速度。创建索引也比较简单,示例代码…

    MongoDB 2023年5月16日
    00
  • MongoDB数据库部署环境准备及使用介绍

    下面是关于“MongoDB数据库部署环境准备及使用介绍”的完整攻略。 一、环境准备 1. 安装MongoDB 首先,访问MongoDB官网并下载安装包,根据系统版本选择对应的安装包。下载完毕后,运行安装包并按照提示完成安装即可。 2. 启动MongoDB服务 MongoDB安装完成后,还需要启动MongoDB服务,才能正常使用。在Windows系统中,可以使…

    MongoDB 2023年5月16日
    00
  • MongoDB慢查询与索引实例详解

    MongoDB慢查询与索引实例详解 本篇文章将分别从慢查询和索引入手,通过实例,向大家详细讲解MongoDB慢查询和索引的使用。 什么是慢查询? 慢查询是指查询花费时间较长的查询语句,它会导致系统变慢、性能降低的情况。为了更好地提高MongoDB的性能,需要尽可能的避免慢查询的出现。 如何查询慢查询? MongoDB提供了db.currentOp()的命令,…

    MongoDB 2023年5月16日
    00
  • MongoDB插入数据的3种方法

    MongoDB插入数据通常有3种方法,它们分别是使用insert()函数,使用save()函数以及使用bulkWrite()函数。下面我们将为大家详细讲解这3种方法以及示例说明。 insert()函数插入数据 insert()函数是 MongoDB 中最基本和常见的插入方法之一。下面是insert()函数的语法和参数: db.collection.inser…

    MongoDB 2023年5月16日
    00
  • 关于Mongodb 认证鉴权你需要知道的一些事

    关于 MongoDB 认证鉴权,我们需要明确以下几点: 什么是 MongoDB 认证鉴权? MongoDB 认证鉴权是 MongoDB 数据库提供的一种安全机制。它可以保护你的 MongoDB 数据库中的敏感数据不被未经授权的访问,同时还可以通过用户名和密码来识别和授权用户。 如何配置 MongoDB 认证鉴权? 首先,需要在 MongoDB 服务器上启用认…

    MongoDB 2023年5月16日
    00
  • Java实现同步枚举类数据到数据库

    好的。Java实现同步枚举类数据到数据库可以通过以下步骤实现: 1. 枚举类的定义 首先,我们需要定义一个枚举类,用来存储需要同步到数据库的数据,例如下面的示例: public enum AccountType { SAVINGS, CHECKING, MONEY_MARKET } 这个枚举类定义了三种银行账户类型,每种类型对应一个枚举值。 2. 数据库表的…

    MongoDB 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部