MFC如何使用静态MFC库

大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人。

所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了。

VS这个做的不够好,默认情况下居然报错:

VC编译错误:

1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@[email protected]) 已经在 LIBCMT.lib(new.obj) 中定义
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@[email protected]) 已经在 LIBCMT.lib(delete.obj) 中定义
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??[email protected]@Z) 已经在 LIBCMT.lib(new2.obj) 中定义
1>../bin/TLLogger_Unicode_Release.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

网上搜索后,发现,都没有明显的说明一个问题,那就是MFC是unicode还是muiltibytes。总之 VS隐藏了许多细节,但我们要了解这些细节,才能解决问题!

在此我做一个完整的补充:

首先确定两个库:前一个是 mfc的静态库,后一个是 C的静态库

Unicode Debug
===========
uafxcwD.lib;libcmtD.lib;

Unicode Release
===========
uafxcw.lib;libcmt.lib;

MultiBytes Debug
===========
nafxcwD.lib;libcmtD.lib;

MultiBytes Release
===========
nafxcw.lib;libcmt.lib;

然后解决方案是:

(分三步)

一、首先配置MFC的使用为在静态库中使用MFC:

属性->常规->MFC的使用,选择“在静态库中使用 MFC”

二、然后,配置运行库:

属性->C/C++->代码生成->运行库,选择“多线程(/MT)”

三、最后,在附加依赖项中加入nafxcw.lib和libcmt.lib两个库文件:(注意:库nafxcw.lib必须先于库libcmt.lib,前者为mfc静态链接库,后者为c运行时库)

属性->链接器->输入->附加依赖项,添加nafxcw.lib和libcmt.lib
解决方法:

http://blog.vckbase.com/zaboli/archive/2010/02/05/40921.aspx

原因:

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

当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误。

解决方法:

强制链接器按照正确的顺序链接库!

project->properties->Linker->Ignore Specific Library 添加 uafxcwd.lib Libcmtd.lib (输入- 忽略特定库)

在Additional Dependencied添加uafxcwd.lib Libcmtd.lib (输入- 附加选项 )

参考链接:

http://blog.csdn.net/lejun2011/article/details/8115463

http://blog.csdn.net/liucanrui/article/details/6453986

---恢复内容结束---

时间: 2024-10-12 13:57:12

MFC如何使用静态MFC库的相关文章

非MFC工程中使用MFC库

需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console Application.MFC Application.Win32 Project等.在创建MFC工程时,通过IDE的向导会自动帮我们创建相应的类文件和包含必需的头文件,但有时候我们需要在非MFC工程中包含MFC的库.至于为什么会有这个需要,为何不在一开始就创建MFC工程呢?可能有两种原因:1.在MFC工程会产生很多向导生成的代码以及资源文件,如基于单文档的工程会有View,Doc等类,很多时候我们并

静态MFC CSocket CAsyncSocket map_pp.cpp错误

静态MFC,在线程中使用SOCKET,发生错误: Debug Assertion Failed!Program:...File:f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\map_pp.cppLine:179 这是MFC的一个BUG,在6.0中就发现,可惜微软到VS2013还是没有修改,估计这个东西微软也要淘汰了,懒得改了,下面是MSDN的解决方法: When using MFC sockets in secondary threads in a sta

动态链接库和静态链接库

#1,静态链接库 lib指令在exe中: 不能再包含其他动态库或静态库: #2,动态链接库 该dll不必在最终exe文件中: exe可"动态"引用或卸载这个dll: 可以包含其他的动态库或者静态库: #3,动态库的其他概念 dll的编程机制与具体的编程语言和编译器无关: 动态链接库随处可见 Kernel32.dll:主要处理内存管理和进程调度: user32.dll:主要控制用户界面: gdi32.dll:负责图形方面的操作: VC动态链接库分类 Non-MFC dll:不采用MFC类

VS2010中如何将动态链接库改成静态链接库

VS2010中如何将动态链接库改成静态链接库 VS2010静态编译生成的.exe可执行文件,可以免安装免DLL在其他电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖动态链接库. 1. 编译实现方式有两种 [1]debug方式的静态链接: 设置: (1)项目 -> 配置属性->常规->MFC的使用:在静态库中使用MFC(如果有使用MFC). (2)项目 -> 配置

静态链接库和动态链接库的区别及优缺点

动态链接库和静态链接库的区别 本文参考了以下博客:      1. http://blog.csdn.net/gamecreating/article/details/5504152      2. http://blog.csdn.net/left_la/article/details/12098545      3. http://blog.csdn.net/augusdi/article/details/6460415 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序

介绍静态链接库和动态链接库的区别,及在VC++6.0中的建立和使用

首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其对应的文件格式是.lib.即当程序采用静态链接库的时候,.lib文件中的函数被链接到最终的可执行文件中,因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行. DLL是动态链接库,在程序运行的时候被调用,其对应的文件的格式是.dll.即当程序采用动态链接的时候,.dll文件中的函数并没有被链接到可执行文件中,可执行文件只是保存了函数的地址信息.但是

C++ 动态链接库和静态链接库

概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了"无库-静态链接库-动态链接库"的时代. 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了.但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以"动态"地引用和卸载这个与EXE

MFC六大机制 (1) MFC程序的初始化

本章将先介绍 MFC 的文档/视图结构,讲解实现该结构的数据结构,然后编写一个控制台应用程序来模拟 MFC 的初始化,理清 MFC 初始化的顺序,然后说明如何创建一个最基本的 MFC 应用程序. MFC 最重要的结构 文档/视图结构 MFC 提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列启动文件,还提供标准的图形用户界面如菜单.工具栏.状态条等供开发人员在程序中补充完善,开发人员只需要完成针对待定应用的代码即可.其中最重要的框架就是其于文档/视图结构的文档应用

dll和lib(包括静态链接库和与dll同时生成的lib)

转:http://blog.csdn.net/galaxy_li/article/details/7411956 1:神马是Dll和Lib,神马是静态链接和动态链接 大家都懂的,DLL就是动态链接库,LIB是静态链接库.DLL其实就是EXE,只不过没main. 动态链接是相对于静态链接而言的.所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源.而动态链接则是提供了一个函数的描述信息给可执行文件(并