0

我无法获得使用 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 "_D​​EBUG" /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 "_D​​EBUG" /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)
4

1 回答 1

1

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

至于用VC10自己构建wx,在导入VC9项目时确实有时会出现一些问题,自定义构建规则会莫名其妙地被破坏。如果发生这种情况(尽管 AFAIK 还没有人报告 wx 2.9.4 项目文件),只需手动复制自定义构建规则setup.h或手动执行它们。

FWIW 我们希望在 3.0 版本(即将推出)中拥有“原生”VC10 和 VC11 项目。

于 2012-09-09T14:35:07.020 回答