博客
关于我
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
阅读量:792 次
发布时间:2023-01-31

本文共 1751 字,大约阅读时间需要 5 分钟。

在创建MFC项目时,如果没有设置好项目参数,编译时可能会出现许多连接错误。今天遇到的一种常见错误是:

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

这种错误通常发生在一个项目未正确设置子系统类型时。具体来说,控制台项目需要使用Windows子系统,而不是Console。要进行设置:

  • 右键点击项目名,选择【Project Settings】。
  • 切换到【Link】属性页。
  • 在【Project Options】中,将 /subsystem:console 修改为 /subsystem:windows
  • 但有时候实际情况相反,可能会遇到类似的另一类错误:

    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

    这种情况下,正确的解决方法是将【Link】属性页的 /subsystem:windows 切换为 /subsystem:console

    这类错误的根本原因在于新建工程时没有正确区分 Win32 Application 和 Win32 Console Application。两者都是在32位 Windows 环境中运行的程序,但它们的本质区别在于入口函数:

    • Win32 Application 使用 WinMain 作为入口函数。
    • Win32 Console Application 使用 main 作为入口函数。

    这里的关键是理解 Win32 Application 是默认的选择,而传统的 C 程序需要选择 Win32 Console Application 才能正常编译。VC++ 中默认设置会导致链接错误,需要在【Link】属性页正确设置子系统类型,才能避免上述错误。

    此外,还有其他常见的 LNK2001 错误需要注意:

  • 缺少 main 入口

    libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

    这提示需要在【C/C++】属性页的【Output】选项卡中,将入口符号设置为 main 或借助 VC++ 项目解释机制正确识别。

  • MFC 项目入口设置错误

    msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

    MFC 项目的默认入口函数是 WinMain,但在编译 Unicode 版本时,这个入口需要重命名为 wWinMainCRTStartup。可以参考【C/C++】属性页的【Output】选项卡,按照需要设置入口符号。

  • 线程运行时库设置错误

    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

    这表明需要正确设置多线程运行时库。在【C/C++】属性页选择【Code Generation】,检查是否需要 Debug Multithreaded 或 multithreaded DL[2],以支持线程安全应用开发。

  • 在项目设置过程中,请务必注意以下几点,避免类似错误的发生:

    • 选择正确的 Win32 应用类型。
    • 单线程模式适用于只需 basic I/O 操作的项目。
    • 多线程模式用于需要多任务处理的应用。

    尤其是对于需要调用标准 C 库函数(如 sleep()printf())的项目,确保线程安全库设置正确,可以选择 Debug 选项以获得更好的调试体验。

    总之,理解项目类型、入口函数以及必须调用的运行时库设置,是避免上述错误的关键。希望这些信息能帮助开发者更好地配置项目参数,顺利进行 MFC 应用程序的开发。

    这篇文章转载自 Cao的博客,中文版有微小改动,仅用于分享和学习。

    你可能感兴趣的文章
    LinkedList源码分析--jdk1.8
    查看>>
    LinkedList的基本用法
    查看>>
    LinkedList(1):链表介绍和单向链表的实现
    查看>>
    LinkedList(2):双向链表的实现
    查看>>
    LinkedList(3):并发异常
    查看>>
    LinkedList(4):多线程LinkedList 不安全情况
    查看>>
    LinkHashMap源码
    查看>>
    linkin大话设计模式--适配器模式
    查看>>
    LinkSage:基于 GNN 的 Pinterest理解
    查看>>
    Linksys RE7000无线扩展器 RCE漏洞复现(CVE-2024-25852)
    查看>>
    LinkWeChat,唯一以开源为核心的SCRM
    查看>>
    link和@import的区别
    查看>>
    link和Import区别
    查看>>
    link标签中的integrity和crossorigin字段---web前端工作笔记015
    查看>>
    link标签的rel属性
    查看>>
    Linly-Talker智能数字人实时对话系统如何部署体验
    查看>>
    Linq DataTable Group By 分组显示人员明细
    查看>>
    LINQ to DB 开源项目教程
    查看>>
    Linq to Entities不识别方法
    查看>>
    linq to entity常用操作
    查看>>