需要引用afx.h和windows.h,并且还需要libcmtd.lib
首先是afx.h和windows.h冲突。
解决方法是在stdafx.h 里,将afx.h添加在windows.h之前。 我的windows.h都在.c里使用,就干脆全移到.c里引用了。
仅仅在stdafx.h 里添加afx.h即可。
然后带来的冲突是
mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)
在dll或者lib的工程中,由于afx.h默认带了一个DllMain,致使要使用CString类需要几个步骤。
1、首先和控制台程序一样,如果编译环境设置了采用单线程库, 要改成多线程库,这个可以从工程属性里进行修改,详细信息可以参考候捷的<<mfc 深
入浅出>>. 下面给出的是我常用的方式,可以直接把它复制到工程里使用:
#ifdef _DEBUG
#pragma comment(lib, "libcmtd.lib")
#else
#pragma comment(lib, "libcmt.lib")
#endif
2、工程目录下创建一个DLLMODUL.CPP文件,并且把它加入到当前工程中。
3、打开DLLMODUL.CPP文件,编辑这个文件为这样:
#include "stdafx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/
// global data
// The following symbol used to force inclusion of this module for
_USRDLL
#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }
#else
extern "C" { int __afxForceUSRDLL; }
#endif
接下来的错误是
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)" already defined in
LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void __cdecl operator delete(void *)" already defined in
LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
already defined in LIBCMTD.lib(dbgnew.obj)
CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。
这些函数要求先链接 MFC 库,然后再链接 CRT 库。
这个解决方法是
选择:菜单“项目”-->“设置”->链接-->Input。
在第一行“对象/库模块”中最前面输入Nafxcwd.lib;Libcmtd.lib
在第二行“忽略库”框中,输入Nafxcwd.lib;Libcmtd.lib。
确定,重新链接,通过!