【问题标题】:wxWidgets and Visual Studio Linker Error When Compiling with a Static Library使用静态库编译时出现 wxWidgets 和 Visual Studio 链接器错误
【发布时间】:2012-06-01 06:13:17
【问题描述】:

在 Visual Studio 2010 中编译 wxWidgets 时出现此链接器错误。

msvcrt.lib(wcrtexew.obj) : error LNK2001: unresolved external symbol _wWinMain@16

现在问题来了。 wxWidgets 的入口点是这个宏:

IMPLEMENT_APP(MyApp)

这意味着我不使用 wWinMain() 作为条目。

我尝试在编译时禁用入口点 (/NOENTRY),但没有骰子。似乎没有任何效果,因为如果我定义 wWinMain(),那么 wxWidgets 将不会启动,因为条目是 IMPLEMENT_APP。

我只在编译为静态时收到此错误。如果我不作为静态编译,我将不得不提供 DLL:Windows Server 2008 上的 msvcp100d.dll 和 msvcr100d.dll(可能还有更多未安装库的旧版本 Windows 上的 DLL)。

现在我知道我正在再次链接调试库,但如果我再次链接发行版也没关系,因为我应该收到相同的错误(未解析的外部符号 _wWinMain@16)。

有什么解决办法吗?

【问题讨论】:

    标签: visual-studio winapi linker wxwidgets


    【解决方案1】:

    当您链接到静态库时,您必须确保使用与构建应用程序代码时完全相同的参数构建库。

    所以:检查库构建和应用程序构建的所有编译器选项,并确保它们匹配。此外,请确保应用程序构建链接到使用您匹配的配置构建的静态库。

    这很痛苦!您必须决定是要处理这个问题,还是要在目标机器上安装正确的 DLL。无论哪种方式,您都必须解决配置管理问题。

    在您的特定问题中,我看到链接器正在寻找 _wWinMain@16,这表明您已在打开 unicode 的情况下构建应用程序代码,但正在链接到非 unicode 静态库。

    【讨论】:

      【解决方案2】:

      首先编译 wxWidgets 的库 (wxWidgets\build\msw),所有设置都与您在项目中的设置相同。所以我启用“/MT”,“在静态库中使用 MFC”,并将项目输出为“发布”。我编写的 wxWidgets 应用程序上的设置完全相同。

      现在注释掉:

      IMPLEMENT_APP(MyApp)
      

      并将其用作您的入口点:

      int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPWSTR lpCmdLine, int nShowCmd)
      {
          char *buf;
      
          buf = new char[wcslen(lpCmdLine) + 1];
      
          wcstombs(buf, lpCmdLine, wcslen(lpCmdLine) +1);
      
          wxApp::SetInstance( new MyApp());
      
          wxEntry(hInstance, prevInstance, buf, nShowCmd);
      
          wxEntryCleanup();
      }
      

      【讨论】:

      • 这不是解决方案,它是解决您尚未真正发现的问题的解决方法。当然,使用 IMPLEMENT_APP() 应该可以正常工作,这就是它的用途——所以你的构建设置有问题。
      【解决方案3】:

      你有吗

      IMPLEMENT_APP(MyApp)

      在 .cpp 文件中?它通常位于 IMPLEMENT_APP(MyApp) 所在的随附文件中。

      我将 wxWidgets 用作静态库,这就是我要编译的。

      【讨论】:

      • 是的。你能上传一个示例项目吗?所以我可以看到我的 VS 设置是否正确和代码。
      • wxWidgets自带的samples文件夹里有很多项目。他们也在使用静态库,你看过了吗?
      • 不,我现在会。好主意。
      • 遗憾的是,他们使用的是 eVC 3/4 工作区 (.vcw),这甚至与 Visual Studio 不兼容。无法用于检查我的 VS 设置。
      • samples 目录应该带有 .sln 项目(我相信它们是 VS2008 项目,但如果你打开它们,你可以将它们转换为 VS2010 项目,这就是我所做的)。你有什么版本的 wxWidgets?
      【解决方案4】:

      将项目的字符集更改为 unicode 后,我遇到了同样的问题。我的项目使用多线程调试 DLL (/MDd)。上述解决方法也对我有用,但我想找出真正导致问题的原因并使用IMPLEMENT_APP

      在我将“使用 MFC”更改为“使用标准 Windows 库”后,我能够成功构建项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多