Win32 Application和Win32 Console Application杂谈

本文探讨了VC++中常见的LNK2001未解析外部符号错误,特别是与WinMain函数相关的问题,并提供了修改/subsystem设置以解决此错误的方法。

最近经常被VC的错误提示所困扰,总结了一下,共同学习.

   学习VC++时经常会遇到链接错误LNK2001,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。产生LNK2001错误的原因:一个是由于编码错误导致的LNK2001,在这不想详细说.另一个由于编译和链接的设置而造成的LNK2001.最经常发生的是:"LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 ",产生这个错误的原因是没有为wWinMainCRTStartup设定程序入口. 认识这个错误首先在新建工程时要分清Win32 Application和Win32 Console Application.它们都是工作在32位Windows环境的程序.其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的.它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。而Win32 Console Application(win32控制台应用程序)往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它,
或者叫CUI(Character User Interface字符用户接口)。 
 遇到如下链接错误:
Linking... /subsystem:windows
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/TestWin.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
解决方法是:将project-settings-link的project options里的 /subsystem:windows
改成 /subsystem:console
因为Win32 Application的入口函数为WinMain
Win32 Console Application的入口函数是main
也就是说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了
而Win32 Application和Win32 Console的区别就在于VC里链接参数不同

一直只是用MFC开发上层的应用程序,也没有去在意什么Win32 ApplicationWin32 Console Application等开发。

        终于到了这么一天,偶要开发一个不需要界面的服务端数据处理程序。在这个重要的Moment,偶也想在沉闷的工作中搞搞新意,于是就在新建工程时选了Win32 Console Application

        我建立的是一个空的工程(empty Project),需要自己加文件。我也是无聊,偏偏加了一个Main.c的文件。然后在该文件加main入口,这时一切都很顺利,入口没任何处理,就是一个返回。执行能通过。

        通过后我就加了一句话:

        cerr << "Ok." << endl;

        弹出出错信息:error C2065: 'cerr' : undeclared identifier,想想,少了包含头文件iostream.h,于是加上。

        再运行,还是出错!!这下我急了,没道理,别人能用,我就用不了啊!VC又不知道偶长得帅不帅,怎么可能偏心呢!花了几个小时到处改设置,甚至在网上动用了所有的搜索引擎,都查不到原因,真是郁闷!现在才后悔当初没好好学习……

        最后,我想只有放弃了,反正用MFC又不犯法,何必跟自己作对呢!就在这最后的一个Moment,我又再次无聊地把Main.c这个文件改名为Main.cpp,顺手编译一下,TMD,通过了……

        总结一下,想想这就是cc++的区别了,但我发梦都没想到,居然这种区别会和文件名相关 

在 Visual Studio 中创建一个新的 **Win32 Console Application**(即传统的 Win32 控制台应用程序)是使用 C/C++ 进行 Windows 原生开发的常见起点。以下是详细的步骤说明,适用于较新版本的 Visual Studio(如 VS 2019 或 VS 2022),并附带示例代码。 --- ### ✅ 步骤:使用 Visual Studio 创建 Win32 Console Application #### 1. 打开 Visual Studio 启动你的 Visual Studio IDE。 #### 2. 创建新项目 - 点击 **“创建新项目”** - 在搜索框中输入 `console`,选择模板: > **Console App (.NET Framework)** ❌(这不是我们要的) > > ✅ 正确的是:**Console Application (Windows Desktop)** 或 > **Win32 Console Application** > ⚠️ 注意:如果你没有看到 "Win32 Console Application" 模板,请确保你安装了 **“Desktop development with C++”** 工作负载。 ##### 如果未安装 C++ 支持: - 转到菜单:**工具 → 获取工具功能** - 安装工作负载:✅ **Desktop development with C++** #### 3. 新建 Win32 控制台项目 - 选择模板:**Win32 Console Application** - 点击“下一步” - 输入项目名称(例如:`MyWin32App`) - 设置位置 → 点击“创建” #### 4. 配置项目向导 点击“创建”后会弹出 **Win32 应用程序向导**: - 点击“下一步” - 在“应用程序设置”中: - 应用程序类型:✅ **控制台应用程序 (Console application)** - 附加选项:✅ **预编译头(Precompiled header)**(可选,建议初学者勾选以提高编译速度) - 取消勾选“安全开发生命周期 (SDL) checks”(可选,避免额外警告) - 点击“完成” Visual Studio 将自动生成基础代码结构。 --- ### 📜 自动生成的代码示例(C++) ```cpp // MyWin32App.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" // 使用预编译头(如果启用) #include <iostream> int main() { std::cout << "Hello, Win32 Console World!\n"; return 0; } ``` > 🔍 解释: > - `#include "pch.h"` 是预编译头文件,在项目启用“预编译头”时需要保留。 > - `<iostream>` 提供输入输出流支持。 > - `std::cout` 输出字符串到控制台。 > - `main()` 是程序入口点。 --- ### 🧪 编译与运行 - 按下 **Ctrl + F5**(直接运行,不调试)或 **F5**(调试运行) - 控制台窗口将显示: ``` Hello, Win32 Console World! ``` --- ### 💡 补充说明:Win32 Console vs 标准 C++ Console - “Win32 Console Application” 并不是指必须写 Windows API; - 它只是一个基于 Win32 子系统的控制台程序模板,允许你后续调用 Windows API(如 `MessageBox`, `CreateFile` 等)。 - 若只写标准 C++ 代码(如 `cout`, `cin`),它普通控制台程序无异。 如果你想混合使用 Windows API,可以这样扩展: #### 示例:结合 Windows API 弹窗 + 控制台输出 ```cpp #include "pch.h" #include <iostream> #include <windows.h> int main() { std::cout << "这是一个 Win32 控制台程序!\n"; // 调用 Windows API 显示消息框 MessageBoxA(NULL, "你好,Windows API!", "提示", MB_OK | MB_ICONINFORMATION); return 0; } ``` > ✅ 这体现了 Win32 控制台项目的灵活性:既能操作控制台,也能调用原生 Windows 功能。 --- ### ❓ 常见问题排查 | 问题 | 解决方法 | |------|---------| | `fatal error C1083: Cannot open include file: 'pch.h': No such file or directory` | 删除 `#include "pch.h"` 或关闭预编译头(项目属性 → C/C++ → 预编译头 → 不使用预编译头) | | 项目无法生成 | 确保选择了正确的平台(x86/x64)配置(Debug/Release) | | 中文乱码 | 在源码中添加 `setlocale(LC_ALL, "");` 或保存为 UTF-8 with BOM 编码 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值