封装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所在目录添加到附加库目录。