【问题标题】:wxWidgets (static lib) will not link under VC++ 2010wxWidgets(静态库)在 VC++ 2010 下不会链接
【发布时间】: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 "_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: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


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道“复制 setup.h 的自定义构建规则”或“手动执行它们”是什么意思。我所知道的是 MS 向导不会为 23 个项目创建有效的 .vsxproj 文件。您是否建议在不使用 .vsxproj 文件和 Visual Studio 的情况下进行构建?或者有什么方法可以在不使用向导的情况下创建 .vsxproj 文件?你能明确给出步骤吗?
  • 我得到了一个新版本的源代码,并再次努力在 VC++ 2010 下构建。这一次情况似乎变得更好了。我不知道为什么。可以想象,VC++ 向导随着自动更新而改变。任何。 Wx 构建了除第一次尝试之外的所有项目。那是建立在第二次尝试的基础上的。 (奇怪,嗯?)有数百个警告,但我似乎确实有 .lib 文件。也许我现在很好。
  • 我没有意识到您根本没有获得任何 .vcxproj 文件,通常它们是由向导创建的,但有时不会导入自定义构建步骤。显然,在你的情况下发生了更糟糕的事情。无论如何,很高兴看到下次导入的效果更好。
猜你喜欢
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多