【发布时间】:2012-09-02 13:14:46
【问题描述】:
在 VC++ 2010 下,我无法获得使用 wxWidgets 静态库正确编译和链接的 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 "." /一世 ".....\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:prompt /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:精确 /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)
【问题讨论】:
-
使用 VS2010 从源代码构建 wxWidgets。
-
@Alex 我最初尝试过,在我用 2008 构建它之前。我遇到了同样的问题乘以 1000。我没有找到 2010 的 wxWidgets 库项目文件。当我将 2008 转换为2010 没有欢乐。
-
我用 2010 构建 wxWidgets,将现有的 wxWidgets-2.n.n\build\msw\wx.dsw 转换为 2010 格式。我什至不知道它是什么版本,只需双击并转换为2010。你到底有什么问题,用VS2010构建?
-
@Alex Microsoft 的转换向导会为目标创建无意义的名称,我不知道什么,然后在链接时警告您它无法理解它们。果然,项目将无法正常构建。要想弄清楚如何正确设置它需要获得 Microsoft 混淆方面的硕士学位。我不知道怎么做。
-
@Alex - 我不相信如果我能够将 2008 年的项目文件转换为正确构建的 2010 年的文件,它会有所作为。这些库在 2008 年下构建良好。它正在编译 2010 年下的应用程序,这很糟糕。编译后的应用程序认为它想要来自 DLL 的东西。更改库的编译方式不会对此产生影响。它认为它想要从 DLL 中得到的东西总是与 STL wchar_t 字符串有关。
标签: visual-studio-2010 visual-studio-2008 visual-c++ wxwidgets