我无法获得一个使用wxWidgets静态库在VC ++ 2010下正确编译和链接的wxWidgets程序。在VC ++ 2008下,没关系。 (WxWidgets仍附带vc ++ 2008项目文件。)
我编译并运行了wxWidgets附带的“最小”示例程序。这是一个GUI hello world。没问题。我使用VC ++ 2010将.vsproj转换为.vsxproj并尝试在VC ++ 2010下编译和链接。问题。
请放心,除了运行VC ++ 2010转换以创建minimal.vsxproj之外,我绝对没有改变。
我收到了许多链接器警告和错误,所有这些都与wxWidgets libs中的STL wchar_t字符串有关。这就是我认为正在发生的事情。我相信在wxWidgets代码中必须有#ifdefs选择__declspec(import),而不是基于预处理器符号。当VC ++ 2010转换项目时,它必须将符号更改为欺骗wxWidgets的东西。如果是这样,那么bug就可能出现在任何一个地方,要么wxWidgets对预处理器定义做出无效的假设,要么VC ++ 2010转换搞砸了它们。 用于编译项目中单独的.cpp文件的命令行与我期望的不同。
2008命令行
/ Od / I“..... \ lib \ vc_lib \ mswud”/ I“..... \ include”/ 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:队列
示例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)
答案 0 :(得分:1)
你绝对必须构建wxWidgets和应用程序使用相同版本的编译器,不同的MSVC版本使用不同的,不兼容的CRT版本,所以你根本没有机会使用VC10构建一个应用程序并将其与使用VC9构建的wxWidgets链接。
至于使用VC10构建wx本身,在导入VC9项目时确实存在一些问题,自定义构建规则可能会以某种方式被破坏。如果您遇到这种情况(虽然AFAIK没有人报告过wx 2.9.4项目文件),只需手动复制setup.h
的自定义构建规则,或者只需手动执行它们。
FWIW我们希望在3.0版本(即将推出)中拥有“原生”VC10和VC11项目。