wxWidgets(静态库)将不会在VC++2010下链接



我无法获得使用wxWidgets静态库在VC++2010下正确编译和链接的wxWidget程序。在VC++2008下,一切都很好。(WxWidgets仍然附带vc++2008项目文件。)

我编译并运行了wxWidgets附带的"最小"示例程序。这是一个GUI hello世界。没问题。我使用VC++2010将.vsproj转换为.vsxproj,并尝试在VC++2010下编译和链接。问题

请放心,除了运行VC++2010转换来创建minimal.vsxproj.之外,我什么都没做

我收到了许多链接器警告和错误,所有这些都与wxWidgets库中的STL wchar_t字符串有关。以下是我认为正在发生的事情。我相信wxWidgets代码中一定有#ifdefs,根据预处理器符号选择__declspec(导入)或不选择。当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_deplate=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_deplate=1"/D"_CRT_NON_CONFORMING_SWPRINTFS=1"/D"_SCL_SECURE_NO-warns=1"-D"WXMSW"/D"_UNICODE"/D"_WINDOWS"/D"NOPCH"/Gm-/EHsc/RTC1/MDd/GS/fp:精确/Zc:wchar_t/Zc:forScope/GR/Fp"vc_mswud\minimal\minimal.pch"/Fa"vc_mswud\minimum\"/Fo"vc_mswud\minimum\"/Fd"vc_mswud\minimal.pdb"/Gd/analyze-/errorReport:队列

示例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)

您绝对必须使用相同版本的编译器构建wxWidgets和使用它的应用程序,不同的MSVC版本使用不同的、不兼容的CRT版本,因此您根本不可能使用VC10来构建应用程序并将其与使用VC9构建的wxWidget链接。

至于用VC10构建wx本身,在导入VC9项目时有时确实会出现一些问题,自定义构建规则可能会被破坏。如果这种情况发生在您身上(尽管AFAIK还没有为wx 2.9.4项目文件报告过),只需手动复制setup.h的自定义构建规则,或者只需手动执行即可。

FWIW我们希望在3.0版本中有"原生"VC10和VC11项目(即将发布)。

最新更新