error LNK2005: “void __cdecl operator delete(void *)“ (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_scalar.o

解决LNK2005与LNK1169错误
本文介绍了解决Visual Studio中LNK2005和LNK1169错误的方法。这两种错误通常出现在链接阶段,提示函数或变量被多次定义。文章提供了一种简单有效的解决方案:通过修改项目设置,在共享DLL中使用MFC而非静态库。

如题:

  1. error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_scalar.obj) 中定义

  2. fatal error LNK1169: 找到一个或多个多重定义的符号

    我只是定义了一个类,还是自动生成的,连类里面的内容都没有写,就报了一个2005,一个1169,如图所示。
    在这里插入图片描述

查看了网上的资料,发现大多提到的原因都是 重定义了某些函数或者变量,让我直接就懵逼了,我只是写了个类,构造函数都还是空的,怎么会重定义?
项目->属性->高级->MFC的使用
将下图的第三步即 在静态库中使用MFC 改为在 共享DLL中使用MFC,报错解决。
在这里插入图片描述
在这里插入图片描述

`error LNK2005` 错误通常是由于函数或变量的重复定义导致的。在编译过程中,编译器将各个 `.cpp` 文件分别编译成目标文件(`.obj`),链接器在链接这些目标文件时发现了重复的定义,就会报 `LNK2005` 错误。对于 `error LNK2005: "void __cdecl del(void)" (?del@@YAXXZ) 已经在 del.obj 中定义` 错误,可以尝试以下解决方法: ### 1. 检查函数定义是否重复 确保 `del` 函数没有在多个 `.cpp` 文件中重复定义。根据引用[2],对于一个函数来说,声明可以多次,但定义只能一次。如果在多个 `.cpp` 文件中都定义了 `del` 函数,需要将多余的定义删除,只保留一处定义。 例如,在 `main.cpp` 和 `del.cpp` 中都定义了 `del` 函数: ```cpp // main.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } int main() { del(); return 0; } // del.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } ``` 需要将其中一个文件中的 `del` 函数定义删除,只保留一处。可以将 `del.cpp` 中的 `del` 函数定义删除,然后在 `main.cpp` 中包含 `del.cpp` 的声明: ```cpp // main.cpp #include <iostream> // 声明 del 函数 void del(); int main() { del(); return 0; } // del.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } ``` ### 2. 使用头文件和 `#pragma once` 或 `#ifndef` 保护 如果 `del` 函数的声明在头文件中,确保头文件使用了 `#pragma once` 或 `#ifndef` 保护,以防止头文件被重复包含。 使用 `#pragma once`: ```cpp // del.h #pragma once #include <iostream> void del(); // del.cpp #include "del.h" void del() { std::cout << "Deleting..." << std::endl; } // main.cpp #include "del.h" int main() { del(); return 0; } ``` 使用 `#ifndef`: ```cpp // del.h #ifndef DEL_H #define DEL_H #include <iostream> void del(); #endif // del.cpp #include "del.h" void del() { std::cout << "Deleting..." << std::endl; } // main.cpp #include "del.h" int main() { del(); return 0; } ``` ### 3. 检查库文件冲突 有时候,重复定义的错误可能是由于库文件冲突引起的。确保没有重复链接相同的库文件,或者检查是否有库文件中定义了与 `del` 函数同名的函数。根据引用[1],CString 在 DLL 中使用时可能会出现类似的库文件冲突问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值