使用静态库编译时wxWidgets和Visual Studio链接器错误

时间:2012-05-25 16:33:52

标签: visual-studio winapi linker wxwidgets

在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)。

任何解决方案?

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

你有吗

IMPLEMENT_APP(MyApp)

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

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

答案 2 :(得分:0)

首先使用项目中的相同设置编译wxWidgets库(wxWidgets \ build \ msw)。所以我启用“/ MT”,“在静态库中使用MFC”,并将项目输出为“Release”。我编码的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();
}

答案 3 :(得分:0)

我将项目的字符集更改为unicode后出现了同样的问题。我的项目使用多线程调试DLL(/MDd)。上面的解决方法也适用于我,但我想找出实际导致问题的原因并使用IMPLEMENT_APP

我改变了"使用MFC"到"使用标准Windows库"我成功地建立了这个项目。