VC 链接错误的处理

需要引用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。
确定,重新链接,通过!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值