在静态库中使用MFC

本文介绍了在Visual Studio中配置MFC静态链接时遇到的库重定义问题及其解决步骤。通过调整项目设置并正确添加所需的库文件,可以有效避免此类错误。

在项目的配置属性中配置MFC的使用”时,选项的区别:如果选择"在共享 DLL中使用 MFC"的话,编译后的程序中不包含MFC库,所以文件会比较小,但是如果程序直接移到一个没有安装过MFC的机器上时,可能会导致找不到MFCDLL,如果选择"静态库中使用 MFC  ",那么编译后的程序就直接包含了调用MFC的部分的库,文件可能会大一些,但是可以直接移到其他机器上运行.

1.

在选择"在共享 DLL中使用 MFC"时编译没有问题,但是在改为选择"静态库中使用 MFC "时出现了库重定义的问题。。。

解决方法:(分三步)

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

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

然后,配置运行库:

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

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

属性->链接器->输入->附加依赖项,添加nafxcw.liblibcmt.lib

OK了!!!

### MFC静态库与共享DLL的区别 MFC(Microsoft Foundation Classes)支持两种主要的链接方式:**静态链接**和**动态链接(共享DLL)**。这两种方式在应用程序的部署、可执行文件大小、依赖性管理等方面存在显著差异。 #### 静态链接到MFC 当选择“在静态库使用MFC”时,MFC库的代码会被直接编译到目标文件(如EXE或DLL)中。这种方式的优点是生成的程序可以在没有MFC运行时的机器上运行,因为它已经将必要的MFC代码打包进可执行文件中。然而,这也导致了可执行文件的体积显著增加,因为MFC库的代码被复制到了每一个使用它的程序中。 例如,一个使用静态MFC链接的EXE文件可能包含如下代码片段: ```cpp #include <afxwin.h> // MFC核心头文件 class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMainWindow : public CFrameWnd { public: CMainWindow() { Create(NULL, _T("MFC Static Link Example")); } }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp theApp; ``` 该程序在编译时会将MFC静态库代码打包进最终的EXE文件中,因此不需要目标机器上安装MFC运行库。但生成的EXE文件会比动态链接方式大得多[^3]。 #### 动态链接到MFC(共享DLL) 当选择“在共享DLL中使用MFC”时,MFC库的代码不会被编译进目标文件,而是作为共享DLL(如`mfc140u.dll`)存在。这意味着生成的可执行文件更小,因为它只包含程序本身的代码,而MFC库的实现则由操作系统在运行时加载。然而,这也意味着目标机器必须安装相应的MFC运行库,否则程序将无法运行。 例如,一个使用动态MFC链接的DLL项目可能如下所示: ```cpp #include <afxwin.h> // MFC核心头文件 class CMyDLLApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMyDLLClass : public CObject { public: void ShowMessage() { AfxMessageBox(_T("Hello from MFC DLL!")); } }; CMyDLLApp theApp; BOOL CMyDLLApp::InitInstance() { return TRUE; } ``` 在这种情况下,生成的DLL文件依赖于系统中已安装的MFC DLL文件,因此部署时需要确保这些DLL文件存在于目标系统中,或者通过MFC Redistributable Package进行安装[^1]。 #### 模块状态与资源管理 在MFC规则DLL中,如果选择静态链接MFC,DLL会将MFC库的代码直接编译进DLL文件中,因此在调用DLL接口时,MFC使用DLL自身的资源。这种方式不需要模块状态切换,适用于资源独立的场景。然而,生成的DLL文件较大。 如果选择动态链接MFC,则DLL会与主应用程序共享MFC库。在这种情况下,MFC使用主应用程序的资源句柄来加载资源模板。当DLL和主程序中存在相同ID的资源时,必须进行模块状态切换,以便MFC能够找到正确的资源模板。这种方式更节省空间,但资源管理更为复杂[^4]。 #### 部署与兼容性 - **静态链接MFC**:生成的程序可以在没有MFC运行时的Windows系统上运行,兼容性较好,但可执行文件较大。 - **动态链接MFC**:生成的程序较小,但要求目标系统上安装MFC运行库。如果目标系统未安装MFC运行时,程序将无法运行,除非手动部署MFC Redistributable Package[^1]。 #### 总结 | 特性 | 静态链接MFC | 动态链接MFC | |------|-------------|-------------| | 可执行文件大小 | 较大 | 较小 | | 依赖性 | 无需MFC运行时 | 需要MFC运行时 | | 兼容性 | 更好 | 依赖MFC安装 | | 资源管理 | 使用DLL自身资源 | 使用主程序资源,需模块状态切换 | | 适用场景 | 需要独立部署的应用程序 | 节省空间、依赖系统环境的场景 | ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值