我无法获得使用 wxWidgets 静态库在 VC++ 2010 下正确编译和链接的 wxWidgets 程序。在 VC++ 2008 下,这很好。(WxWidgets 仍然附带 vc++ 2008 项目文件。)
我编译并运行了 wxWidgets 附带的“最小”示例程序。这是一个 GUI hello world。没问题。我使用 VC++ 2010 将 .vsproj 转换为 .vsxproj 并尝试在 VC++ 2010 下编译和链接。问题。
请放心,除了运行 VC++ 2010 转换以创建 minimum.vsxproj 之外,我没有进行任何更改。
我收到了许多链接器警告和错误,都与 wxWidgets 库中的 STL wchar_t 字符串有关。这就是我认为正在发生的事情。我相信 wxWidgets 代码中必须有 #ifdefs 根据预处理器符号选择 __declspec(import) 与否。当 VC++ 2010 转换项目时,它必须将符号更改为愚弄 wxWidgets 的东西。如果是这样,错误可能在任何一个地方,或者 wxWidgets 对预处理器定义做出了无效的假设,或者 VC++ 2010 转换把它们搞砸了。用于编译项目中单独的 .cpp 文件的命令行与我预期的不同。
2008 命令行
/Od /I ".....\lib\vc_lib\mswud" /I ".....\include" /I "." /I ".....\samples" /D "WIN32" /D "_DEBUG" /D "_CRT_SECURE_NO_DEPRECATE=1" /D "_CRT_NON_CONFORMING_SWPRINTFS=1" /D "_SCL_SECURE_NO_WARNINGS=1" /D " WXMSW " /D " _UNICODE" /D "_WINDOWS" /D "NOPCH" /D "UNICODE" /FD /EHsc /RTC1 /MDd /Fo"vc_mswud\minimal\" /Fd"vc_mswud\minimal.pdb" /W4 /nologo /c /Zi /TP /errorReport:提示 /MP
2010 命令行
/I".....\lib\vc_lib\mswud" /I".....\include" /I"." /I".....\samples" /Zi /nologo /W4 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CRT_SECURE_NO_DEPRECATE=1" /D "_CRT_NON_CONFORMING_SWPRINTFS=1" / D "_SCL_SECURE_NO_WARNINGS=1" /D " WXMSW " /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope / GR /Fp"vc_mswud\minimal\minimal.pch" /Fa"vc_mswud\minimal\" /Fo"vc_mswud\minimal\" /Fd"vc_mswud\minimal.pdb" /Gd /analyze- /errorReport:queue
示例 2010 警告和错误
1>wxbase29ud.lib(ipcbase.obj) : warning LNK4049: locally defined symbol ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ (public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::~basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(void)) imported
1>wxbase29ud.lib(mimecmn.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::assign(class std::_String_const_iterator<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::_String_const_iterator<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >)" (__imp_?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z)