MT模式下静态链接错误的问题

今天在学习MFC的过程中遇到了一个问题,在include了afx.h后报错,说不能使用“/MD”;搜了一下网上说是vs本身的报错,于是换用了“/MT”;然后出现了重定义的链接错误:
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new_scalar.obj) 中定义
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_scalar.obj) 中定义
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete[](void *)” (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_array.obj) 中定义
搜了一些文章,决定简要总结一下;
其实现在还是感觉有点模糊的说;
顺便发现了一本一定要看的书。。。写进小本本 =。=~


本例原因:

CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

解决方法:

1.配置MFC的使用为在静态库中使用MFC:
属性->常规->MFC的使用,选择“在静态库中使用 MFC”
2.配置运行库:
属性->C/C++->代码生成->运行库,选择“多线程(/MT)”(Release)或者“多线程调试 (/MTd)”(Debug)。
3.库链接配置
属性->链接器->输入->附加依赖项,添加uafxcw.lib(看具体是什么库,如nafxcw.lib)和libcmt.lib(注意:顺序不能颠倒)

属性->链接器->输入->忽略特定默认库,添加uafxcw.lib和libcmt.lib

另外,MT/MD容易出现的问题:

  1. 相较于动态DLL链接,静态链接的好处是将DLL中的相关代码写进EXE文件中,可以在没有相关DLL的机器上运行。不过文件较大,而且可能存在A堆申请B堆释放的问题;
  2. 所有的模块必须采用相同的运行时库,否则就会出现重定义的错误,因为他们使用的运行时库是不同的文件的缘故。
  3. 但是明明只有一个模块呢?这是因为虽然自己的这个模块用的/MT,但是“uafxcwd.lib”这个库不一定/MD。通过查看.make文件可以查看它用的是什么编译选项。

参考:
/MT、/MD编译选项的区别
MSVCRTD.LIB和LIBCMTD.LIB的冲突
在静态库中使用MFC问题

你可能感兴趣的:(MFC)