error LNK2001: unresolved external symbol _main

本文介绍了解决Visual Studio中出现的LNK2001错误的方法,包括设置正确的子系统类型、配置程序入口点及选择合适的线程运行时库。

error LNK2001: unresolved external symbol _main解决办法
2007年04月07日 星期六 11:39
作者: liuhuinwpu 发表日期: 2006-05-28 复制链接 收藏
解决外部符号错误:_main,_WinMain@16,__beginthreadex )
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数,就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex n  

1. Windows子系统设置错误, 提示:  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main  

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:  

[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows   

2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

控制台项目要使用Console子系统, 而不是Windows, 设置:  

[Project] --> [Settings] --> 选择"Link"属性页,  
在Project Options中将/subsystem:windows改成/subsystem:console  

3. 程序入口设置错误, 提示:  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:

[Project] --> [Settings] --> 选择"Link"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 线程运行时库设置错误, 提示: @: kAF n
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择"C/C++"属性页, ')
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
咸鱼游侠(75374355) 12:11:11
其中,
Single-Threaded                    单线程静态链接库(release版本)
Multithreaded                      多线程静态链接库(release版本)
multithreaded DLL                  多线程动态链接库(release版本)  
Debug Single-Threaded              单线程静态链接库(debug版本)
Debug Multithreaded                多线程静态链接库(debug版本)
Debug Multithreaded DLL            多线程动态链接库(debug版本)

单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用

<think> 我们正在处理一个链接错误,该错误表明程序找不到main函数。在C语言程序中,main函数是程序的入口点。如果链接器找不到main函数,就会报告这样的错误。根据引用内容,错误信息为: LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 以及 Debug/L.exe : fatal error LNK1120: 1 unresolved externals 并且执行link.exe时出错。 结合引用[1]和引用[2]的内容,这个错误通常是由于项目设置不正确导致的。具体来说,可能是项目被设置为控制台应用程序(Console Application),但实际上没有定义main函数;或者项目被设置为Windows应用程序(Win32 Application),但却定义了main函数而不是WinMain函数。 引用[2]中提到,Windows项目要使用Windows子系统,而不是Console。并给出了设置方法: [Project]-->[Settings]-->选择"Link"属性页, 在Project Options中将/subsystem:console改成/subsystem:windows 但是,这个设置是针对Windows应用程序的。如果我们编写的是控制台程序,那么我们应该确保项目类型是控制台应用程序,并且程序中定义了main函数。 引用[3]则指出,如果创建项目时选择了Win32 Application(窗口程序),那么程序的主函数应该是WinMain,而不是main。如果我们错误地将控制台程序创建为窗口程序,就会导致链接器找不到WinMain函数(因为我们的程序里是main函数)而报错。 因此,解决办法有两种: 1. 如果我们确实要写控制台程序(有main函数),那么应该将项目设置为控制台应用程序(Win32 Console Application)。在VC6.0中,可以这样设置: - 打开项目设置(Project -> Settings) - 选择“Link”选项卡 - 在“Project Options”中,找到“/subsystem:windows”并改为“/subsystem:console” 2. 或者,如果我们想写窗口程序,那么将main函数改为WinMain函数。 根据错误信息,这里应该是控制台程序,所以我们采用第一种方法。 另外,还需要确保程序中确实定义了main函数,并且拼写正确(包括大小写,C语言是区分大小写的,main必须小写)。 总结步骤: 步骤1:检查程序是否定义了main函数 ```c int main() { // 代码 return 0; } ``` 步骤2:在VC6.0中设置项目属性 - 打开菜单:Project -> Settings - 选择Link选项卡 - 在Project Options文本框中,找到“/subsystem:windows”并改为“/subsystem:console” - 点击OK保存设置 步骤3:重新编译链接 如果问题仍然存在,可以尝试重建整个项目(Build -> Rebuild All)。 如果还有错误,请检查是否在多个源文件中定义了多个main函数,或者是否在定义main函数时使用了错误的拼写(如mian)。 注意:如果项目中没有源文件包含main函数,也会出现此错误,所以请确保至少有一个源文件包含了main函数。 §§相关问题§§ 1. C语言程序入口函数main的几种标准写法有哪些? 2. 如何在VC6.0中创建控制台应用程序项目? 3. WinMain函数与main函数的区别是什么? 4. 如何解决C语言程序中的链接错误LNK2001? 5. VC6.0中如何设置项目使用多字节字符集? </think># 解决 C 语言编程中的链接错误 LNK2001LNK1120 这些链接错误表明编译器找不到程序的入口点 `main` 函数。以下是完整的解决方案: ## 错误原因分析 错误信息 `LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main` 表明: 1. 项目被设置为控制台应用程序,但没有找到 `main()` 函数 2. 或者项目被设置为 Windows 应用程序,但没有找到 `WinMain()` 函数 ## 完整解决方案 ### 方法一:添加 main 函数(推荐) 在您的 C 源文件中添加标准的 main 函数: ```c #include <stdio.h> int main() { // 您的程序代码 printf("程序成功运行!\n"); return 0; } ``` ### 方法二:修改项目配置 在 VC6.0 中设置项目类型: 1. 打开菜单:`Project` → `Settings` 2. 选择 `Link` 选项卡 3. 在 `Project Options` 中找到 `/subsystem:windows` 4. 将其改为 `/subsystem:console` 5. 点击 `OK` 保存设置 ### 方法三:检查项目类型 确保创建项目时选择正确的应用程序类型: - 控制台程序选择 `Win32 Console Application` - 窗口程序选择 `Win32 Application` ### 方法四:检查函数签名 确保 main 函数签名正确: ```c // 正确的控制台程序入口 int main() { /* ... */ } // 带参数的控制台程序入口 int main(int argc, char* argv[]) { /* ... */ } // Windows 程序入口(仅当项目设置为窗口程序时使用) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* ... */ } ``` ### 方法五:重建项目 1. 清理项目:`Build` → `Clean` 2. 重建项目:`Build` → `Rebuild All` ## 错误处理流程图 ```mermaid graph TD A[遇到 LNK2001 错误] --> B{项目类型} B -->|控制台程序| C[检查 main 函数是否存在] B -->|窗口程序| D[检查 WinMain 函数是否存在] C --> E[添加正确的 main 函数] D --> F[添加正确的 WinMain 函数] E --> G[重建项目] F --> G G --> H{错误是否解决} H -->|是| I[成功] H -->|否| J[检查项目设置] J --> K[修改子系统设置为 console/windows] K --> G ``` ## 常见问题排查表 | 问题现象 | 可能原因 | 解决方案 | |---------|---------|---------| | `unresolved external symbol _main` | 项目设置为控制台程序但缺少 main 函数 | 添加 main 函数 | | `unresolved external symbol _WinMain@16` | 项目设置为窗口程序但缺少 WinMain 函数 | 添加 WinMain 函数 | | 多个未解析符号 | 项目配置错误 | 重建项目或重新创建项目 | | 仅在新机器上出现 | 缺少运行时库 | 安装 VC++ 运行时库 | ## 预防措施 1. **创建新项目时**: - 明确选择 `Win32 Console Application` 或 `Win32 Application` - 使用向导创建基础框架 2. **项目迁移时**: - 检查项目设置中的子系统配置 - 确保所有必要的源文件包含在项目中 3. **团队协作时**: - 在版本控制中包含项目文件(.dsp, .dsw) - 统一开发环境配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值