封装dll遇到的奇葩错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义
封装dll遇到的奇葩错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义
在定义一个dll工程的时候,一添加MFC的头文件就会报出这个 错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义 既蛋疼又蛋疼!!
然后逛论坛,查资料,妹的,都尼玛是去论坛看热闹的,没有一个起的上作用的!无奈之,遂请教。。。于是乎,解决!
在创建Dll工程的时候,需要我们定义一个DllMain的入口函数,问题就出在这里! 当我们添加MFC的头文字时候,MFC默认封装了这个入口函数,你也不知道是哪个头文件里面封装的,但是我包含了这些头文件:<afx.h> <afxinet.h> 就加了这两个头文件就出了问题!
于是只能在自己定义的DllMain.cpp入口函数上做处理,下面是解决之后的内容:
- #include <windows.h>
#ifdef _X86_- extern "C" { int _afxForceUSRDLL; }
- #else
- extern "C" { int __afxForceUSRDLL; }
- #endif
- BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
- {
- switch( ul_reason_for_call )
- {
- case DLL_PROCESS_ATTACH:break;
- case DLL_THREAD_ATTACH:break;
- case DLL_PROCESS_DETACH:break;
- case DLL_THREAD_DETACH:break;
- }
- return TRUE;
- }
其中最关键的就是下面这些内容:
- #ifdef _X86_
- extern "C" { int _afxForceUSRDLL; }
- #else
- extern "C" { int __afxForceUSRDLL; }
- #endif
它的作用就是强制使用你自己定义的DllMain入口函数,因为MFC封装的很扯淡,总是强奸用户!
第二部分:DLL封装C++类
1.首先是针对一个类,将这个类作为接口对外公开
假设类:class CFetchHttp
那么建立dll工程,新建头文件:CFetchHttp.h
- #ifndef EXPORT_CLASS_EXPORTS
- #define EXPORT_CLASS __declspec(dllexport)
- #else
- #define EXPORT_CLASS __declspec(dllimport)
- #endif
- class EXPORT_CLASS CFetchHttp
- {
- //在这里定义方法
- }
然后新建源文件:CFetchHttp.cpp 把类中的方法实现。
输出:CFetchHttp.dll和CFetchHttp.lib
使用时:在你的项目对应的文件中加入
#include "CFetchHttp.h"
同时把CFetchHttp.h所在目录添加到项目的include 目录,把CFetchHttp.dll和CFetchHttp.lib拷贝到新程序目录下,把CFetchHttp.lib所在目录添加到附加库目录。
參考
https://www.bbsmax.com/A/kmzLL4yEzG/
posted on 2021-05-10 17:14 okgogo2000 阅读(212) 评论(0) 编辑 收藏 举报