MFC+BCG库静态链接方法总结

前言

最近在做一个MFC项目,使用了有名的BCG界面库,我的编程平台是 Win10 + VS2015 , 在我自己的机器上测试的时候一直都是使用动态链接的方式,没有什么问题,但是当切换到 Windows Server 2008 R2 系统下,会出现缺少 xxx.dll 的错误,按照往常的做法,缺少的文件也就是VC的运行库,然而我安装VS2015的运行库却失败了,网上一查才发现VS2015的运行时库不支持 Windows Server 2008 R2 ,最低得是 Windows Server 2008 R2 with SP1 ,安装运行库的法子走不通,只能换一条路了。

静态链接

MFC程序可以用动态链接或者静态链接的方式使用MFC的库,动态链接的好处是最后生成的exe文件非常小,缺点是目标机器必须安装对应的运行库,或者要在文件夹里手动放入所需的dll;静态链接的好处是直接把VC的运行库链接到最终的exe里,不必安装运行库或者添加一堆dll就可以直接运行,缺点是生成的exe会比较大。

静态链接多占用的那一点空间对我来说没什么影响,所以我打算采取静态链接的方法解决上面提到的问题,MFC的库好办,只需要改项目属性就可以了,而静态链接BCG库则多一点波折,关于如何静态链接BCG库网上也有很多方法,但是并不全面,经过一番查找,我自己总结了在MFC里静态链接BCG库的方法,内容主要参考自BCG技术问答里的这个问题

总结

准备

  1. 编译所需版本的静态库lib文件(这一步在安装BCG库的时候一般做过了,直接拷贝出来就行,如 BCGCBPRO2510STATICU140.lib
  • 修改项目属性
    • C/C++ -> 代码生成 -> 运行库 里选择 MT (release)或者 MTd (debug)
    • 常规 里选择 在静态库中使用 MFC
  • 将BCGSoft\BCGControlBarPro\BCGCBPro\Styles下的
    • Office 2010 (blue) 文件夹(以该主题为例)
    • BCGPStyle2010Blue.rcBCGPStyle2010Blue.rc2 文件
  • 拷贝到你的项目主目录

修改 stdafx.cpp

stdafx.cpp 文件的最后(在 #include stdafx.h 之后)添加以下代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#if _MSC_VER > 1500
#define COMPILE_MULTIMON_STUBS

#pragma warning(push)
#pragma warning(disable: 4996)

#include "multimon.h"

#pragma warning(pop)

#endif

修改资源文件属性

在资源视图的对话框上点击右键,选择 资源包括(L)...

  1. 只读符号指令 里添加 #include "bcgprores.h"
  • 编译时指令
    • 移除_AFX_NO_SPLITTER_RESOURCES
    • 添加#include "BCGCBPro.rc"#include "BCGPStyle2010Blue.rc"
    • 如果你想动态链接MFC,静态链接BCG, 则添加"#define _BCGCBPRO_STATIC_"
  • (这条基本不用管)如果你的项目是从MFC版本2008或更高版本移植的,请删除资源文件中对 afxribbon.rc 的所有引用,因为它和 BCGCBPro.rc 冲突
Built with Hugo
主题 StackJimmy 设计