【问题标题】:How do I set WinMain as entry point?如何将 WinMain 设置为入口点?
【发布时间】:2014-04-25 00:30:55
【问题描述】:

我已删除 IDE 生成的 _tmain() 方法,因为在添加 WinMainentry 后我发现有两个入口点毫无意义。是的,这是我的第一个 C++ 应用程序,我是新手,但请注意。

这就是我得到的全部:

// Included headers:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
// Shortened namespaces:
using namespace std;
// The main entry of the application:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, L"Hello World!", L"Just another Hello World program!", MB_ICONEXCLAMATION | MB_OK );
    return 0;
}
// End of file.

当我尝试构建和运行时,我得到了这个错误:

错误 LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用

错误 LNK1120:1 个未解决的外部问题

我意识到缺少入口点,但是我在哪里可以将WinMain 设置为入口点?我只是查看了项目本身的属性,没有发现任何东西。 请注意,我已将项目作为控制台应用程序启动,但现在我正试图将其转换为常规 Windows 应用程序。

谢谢。

【问题讨论】:

  • 如果您以前从未这样做过,您怎么能“看不到任何意义”?顺便说一句,答案是你不能——因为那没有意义:)
  • 你用的是什么编译器和IDE?
  • IIRC, WinMain 从操作系统的角度来看并不是真正的入口点。它由运行时环境(或 RT,如 CRT)调用,需要初始化(或启动,如 Startup)。所以,是的,_tmain 的存在是有原因的。这是真正的切入点。 WinMain 只是“按惯例”的入口点。
  • 正确设置所有设置的最简单方法是使用 Win32 项目模板而不是 Win32 控制台应用程序模板。开始错误后的下一个最好的事情是项目+属性,链接器,系统,将子系统设置更改为“Windows”。
  • 我想我误解了你的误解。就像其他人说的那样,使用正确的模板就可以了。

标签: c++ entry-point winmain


【解决方案1】:

您需要将子系统更改为 Windows。

【讨论】:

    【解决方案2】:

    Project->Properties->Linker->System change Subsystem to /SUBSYSTEM:WINDOWS

    如果您还有其他问题,请重新开始,选择 Win32 项目而不是 Win32 控制台。

    【讨论】:

      【解决方案3】:

      听起来您正在尝试使用从 Windows 应用程序导入的代码构建控制台应用程序。

      控制台应用程序使用 main(或 _tmain)入口点,而 Windows 应用程序使用 WinMain(或 _tWinMain)入口点。

      编辑:确实,正如 Benjamin 告诉您的那样,更改链接器选项将解决您当前的问题,但您稍后可能会在此类混合项目中遇到其他问题。例如,您可能包含一些依赖于 _CONSOLE 预处理器符号的代码。 您当然也可以自己调整后者的设置,但最好按照 Scott 和 Hans 的建议从干净的 win32 模板重新启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-17
        • 2011-11-30
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多