WindowsDDK里用std::wstring的问题

今天晚上尝试帮某网友制作一个伪春菜的插件,能够检查两次调用过程中剪贴板里面的东西有没有变化(用GetClipboardSequenceNumber函数)和获取剪贴板里的内容(EnumClipboardFormats和GetClipboardData)。这里都不是重点,重点是我用了 这一篇博客 里面提到的CSaori库来编写。这个库里面的字符是wchar_t类型,这很好,也用了std::basic_string<wchar_t>(其实就是std::wstring),这也很好。不好的地方在于,我为了减小最终DLL的体积、用Windows Driver Kit里面的编译器来编译程序使得动态链接到运行库的时候,报错了。

程序本身是没有问题,因为我用VS2010编译器编译它就正常,而且还能运行,运行起来也没问题。仔细查看DDK编译器的报错信息,大概是

error LNK2019: unresolved external symbol "__declspec(dllimport) p
ublic: wchar_t& __thiscall std::basic_string<wchar_t,struct std::char_traits<wch
ar_t>,class std::allocator<wchar_t> >::operator[](unsigned int)" (__imp_??A?$bas
ic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z) reference
d in function "public: bool __thiscall CSAORIInput::parseString(class std::basic
_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >
 const &)" (?parseString@CSAORIInput@@QAE_NABV?$basic_string@_WU?$char_traits@_W
@std@@V?$allocator@_W@2@@std@@@Z)

这个样子的,目测意思是链接不上std::wstring。

感觉不应该啊,它不是支持宽字符字符串对象的吗。然后上网搜搜出了这么一个东西:

http://stackoverflow.com/questions/5988457/is-wchar-t-supported-in-c-wdk-stl-i-get-unresolved-external-symbols

感觉好坑……编译器和库不够匹配的结果吗。库用的是VC6.0里面的吧,但是因为编译器是新的,默认wchar_t是内置类型,而库并不是这样的,最终链不上。

最终加上了 /Zc:wchar_t- 参数,它就好了。

《WindowsDDK里用std::wstring的问题》上有1条评论

发表评论