【问题标题】:I'm getting the error "LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup"我收到错误“链接:错误 LNK2001:无法解析的外部符号 _WinMainCRTStartup”
【发布时间】:2012-05-23 14:21:55
【问题描述】:

请帮忙。 在 Visual Studio 2008 上,我收到以下错误。

============================================================

   1>Microsoft (R) Windows Resource To Object Converter Version 9.00.30729.01
   1>Copyright (C) Microsoft Corporation.  All rights reserved.
   1>adding resource. type:ICON, name:1, language:0x0409, flags:0x1010, size:744
   1>adding resource. type:ICON, name:2, language:0x0409, flags:0x1010, size:296
   1>adding resource. type:GROUP_ICON, name:128, language:0x0409, flags:0x1030, size:34
   1>adding resource. type:DIALOG, name:100, language:0x0409, flags:0x1030, size:374
   1>adding resource. type:DIALOG, name:102, language:0x0409, flags:0x1030, size:784
   1>adding resource. type:VERSION, name:1, language:0x0409, flags:0x30, size:928
   1>adding resource. type:STRING, name:7, language:0x0409, flags:0x1030, size:68

   1>LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup

   1>.\Release/DiskTest.exe : fatal error LNK1120: 1 unresolved externals

   1>Build log was saved at "file://c:\WinIRDir\Utilities\DiskTest\Release\BuildLog.htm"
   1>DiskTest - 2 error(s), 0 warning(s)
   1>Build log was saved at "file://c:\WinIRDir\Utilities\CommApp\Release\BuildLog.htm"
==============================================================

情况是这样的。 - DiskTest.exe 是我的解决方案中的 3 个项目之一 - 该项目非常适合 Debug x64、Release x64 和 Debug Win32。发行版 Win32 是唯一产生这些错误的版本。 - 我花了几个小时比较所有 4 种配置/机器组合的属性页面,并且确信从一个版本到下一个版本都没有丢失任何属性。我特别注意了“附加依赖项”、“附加库目录”、“输入”等。当然,.lib 文件的路径指向 \Debug 或 \Release,以及各自配置或平台的 \x86 或 \x64 .

此项目唯一的“附加依赖项”是用于调试的 SBF_Util.lib 和 SBF_Utild.lib。我确保该库的所有 4 个版本(调试 win32 和 x64,以及发布 win32 和 x64)都存在于每个“附加库目录”中指定的文件夹中我还检查了每个版本的库的 dumpbin 以确保平台匹配.

我见过其他缺少主入口点的情况,但在这种情况下,所有其他版本都没有问题,只有在 Win32 Relase 版本上会产生此错误,所以我认为我不需要更改代码中的任何内容。

任何人都可以提供任何线索吗?,我没有想法。任何想法将不胜感激。谢谢。

【问题讨论】:

  • 你能告诉我们你传递给编译器的确切命令行参数吗?听起来您是从 Visual Studio 编译的,但它会在“高级”选项卡中向您显示命令行是什么。使用edit 链接将其复制并粘贴到您的问题中。
  • 另外,检查并确保 all 构建配置针对 Unicode。我的第一直觉是代码中的入口点函数签名是非 Unicode 版本,但您在发布模式下链接到的库是 Unicode 版本。因此,链接器找不到它需要的东西。但要做到这一点,所有 other 编译模式都必须针对非 Unicode 配置,这似乎不太可能。
  • 这是命令行:/VERBOSE /OUT:".\Release/DiskTest.exe" /VERSION:3.800 /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\WinIRDir\SbfSdk\lib \x86\Release" /LIBPATH:"..\..\SbfSdk\lib\x86\Release" /MANIFEST /MANIFESTFILE:".\Release\DiskTest.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:PROMPT SBF_Util.lib 附加选项:/version:3.607/subsystem:windows /IGNORE:4089
  • 我删除了“附加选项”,但仍然出现错误。此外,所有模式都使用“字符集”=多字节(不是 unicode),即使是我的解决方案中的其他 2 个项目,它们都使用多字节。我尝试在失败模式(release/Win32)和“良好”模式(release/x64)上使用 Unicode,但在良好模式下出现 C2664 错误,在失败模式下出现相同错误,所以我恢复到多字节。
  • 现在是 2012 年,您仍在构建针对 MBCS 的应用程序?

标签: c++ windows visual-studio winapi linker-errors


【解决方案1】:

难以置信!!!

我发现了问题! 导致这个严重错误的原因非常简单:“空间”

原来在 Configuration->C/C++->OutputFiles->Object File Name: 我有: "$(IntDir)\"

直到我非常仔细地注意 Kdiff3 窗口时才注意到空格,并注意到这个小下划线表示空格。
这个空间已经存在了几个月,因为这个项目一直无人看管(在我加入之前),因为没有人能找到它的修复方法,所以他们就停止使用它。 很可能是复制粘贴错误。

感谢大家的想法。特别是 Xearinox 的第一个答案让我考虑比较所有模式。我会尝试找一些时间来编写一个工具来将项目/解决方案文件解析为一个 4 列的表格,其中列出了所有配置和平台的所有属性,以便我们可以轻松地比较它们。再次感谢大家。

【讨论】:

    【解决方案2】:

    打开项目的设置页面,转到LinkerSystem 并检查SubSystem 属性。通过从配置下拉框中切换配置,确保在所有项目配置中将其设置为相同的值。

    假设您的预期入口点是main(或其变体之一,例如_tmainwmain),您要确保将使用的SubSystem 属性设置为CONSOLE.

    【讨论】:

    • 感谢您的建议。但是,Linker->System->Subsystem 在所有 4 种配置/平台组合中都设置为 Windows,但除 Release/Win32 之外,其他 3 种组合与此设置链接正常。还有其他想法吗?
    【解决方案3】:

    缺少作为入口点的 WinMain。

    【讨论】:

    • 感谢您的建议。那么我们如何解释调试(win32 和 x64)和发布/x64 模式正在正确构建?该错误仅在构建版本 win32 时出现。
    • 我认为你的版本 win32 项目选项有问题,请告诉我你的链接器命令行。
    • 仔细阅读您的帖子后,我觉得 CRT 有问题。如果在链接器/NODEFAULTLIB 和/ENTRY:WinMain@16 中设置并重新编译,错误仍然存​​在?
    • 刚刚将 /NODEFAULTLIB 和 /ENTRY:WinMain@16 添加到 Linker->CommandLine->Additional Options。重新编译并得到相同的错误。我还继续将 VC 项目文件解析为“release/wi32”和“release/x64”的单独文本文件,然后将这两个文件与 Kdiff3 进行比较。两个文件看起来都一样,除了“名称”、“目标机器”、“输出目录”等(显然从模式到模式的属性)。
    【解决方案4】:

    在我的例子中,我试图编译的文件有错误的属性。

    我创建的文件在文件扩展名中有一个杂散字符,所以我的项目给它错误的项目类型:Does not participate in build

    重命名后,我进入它的属性,将项目类型更改为<reset to default>,然后将其重置为C/C++ Compiler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-15
      • 2011-05-06
      • 1970-01-01
      • 2010-11-17
      • 2011-09-29
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多