WDK编译boost(1.34.1)::regex

Windows Driver Kit里面的STL库啊啥的,基本是停留在VC6时代。不过也有一个好处,可以链接到msvcrt.dll、msvcp60.dll,因为这两个文件大家都有,所以可以减小最后生成的可执行文件的体积。然后比起VC6.0,WDK可以直接从微软那边下载来,而VC6直到最后也没像2005、2008、2010、2012、2013那样有个Express的免费版啥的。于是如果想自己弄了简单的小东西如果想要体积小、要链接到msvcrt.dll,感觉WDK是一个挺好的选择……

不过WDK里面的东西并不完善,所以Windows SDK可能还是要准备一个。考虑到要把它当作VC6来处理,所以最新能用的也就是Platform SDK 2003 February。其实本来没打算装这个,因为WDK里面已经带了一套Windows的头文件和库,但是在编译boost的那个bjam的时候,发现WDK里面没有TlHlp32.h文件(当然前提是你已经把api、crt那些的文件夹都加到Include环境变量里了),于是知道它带的东西还是有少的,就装个SDK来补充一下。

安装SDK的时候也还遇到了问题。因为这个SDK版本比较老,它有x86和ia64两个setup.exe、setup64.exe但是却没有给amd64(x86-64)用的setup,于是无法启动安装程序。上网搜索解决方案是直接到文件夹里面去运行它的那些msi安装包来安装组件。那些msi在安装的时候会提示选择要安装的组件、要安装到什么文件夹的。

现在的Boost已经抛弃对VC6.0的支持了,网上找了一圈相关信息,能支持VC6的最新版本是1.34.1(也有说1.34.1的Regex编译起来有问题,1.33.1更容易搞定,不过我没试验过),那就找到这个指定版本下载来,解压。

然后boost解压之后需要一个bjam控制之后的编译过程,在boost\tools\jam\src里可以找到一个build.bat,用它来构建bjam.exe。如果只有WDK、并且在bat的参数指定了MSVC、环境变量指定了MSVCDir为WDK的文件夹(具体开build.bat进去看,很容易找到),就会出现前面说的找不到TlHlp32.h的事情。

接下来,前一篇博客 有提到WDK的编译器和msvcp60.dll配合有问题,编译器默认wchar_t就是wchar_t但是msvcp60认为它是unsigned short,于是在链接的时候出现符号链不上的问题。自己编译的时候还好办,知道/Zc:wchar_t,但是由别人编译的时候问题就有点麻烦,因为不知道怎么加。我研究了很久总之也没找到方法……不管怎么样,就算开-n的时候也能看到/Zc:wchar_t不过看不到/Zc:wchar_t。这样的命令行:
bjam stage release toolset=msvc-6.0 --with-regex runtime-link=shared link=static
最终开到boost\tools\build\v2\tools\msvc.jam文件里面,找到了/Zc:wchar_t,改成/Zc:wchar_t-,再编译,换了个错误,说swprintf函数什么什么不匹配。网上一搜,原来它有个BOOST_NO_SWPRINTF宏,索性就用上了。就是说把
/Zc:wchar_t
改成了
/Zc:wchar_t- /DBOOST_NO_SWPRINTF

再编译,终于能出lib文件了。

仔细查看这一行的上下文,可以发现它是在你编译器指定是VC6.0的时候加入的特定处理。但是,明明有一个<cxxflags>在上面,试了好几种命令行写法,最终也没能成功把参数通过命令行弄进去。

总之经过这样一搞,最终成功在WDK里用起Boost.regex了。顺便一说,测试的结果,因为regex引擎加入进去的关系,最终生成的可执行文件大小只比VC2010用自带regex、静态链接生成的可执行文件的大小小了60KB左右(原来180KB现在120KB)

发表评论