C++ 另一个未定义的引用WinMain@16问题

C++ 另一个未定义的引用WinMain@16问题,c++,gcc,linker,mingw,C++,Gcc,Linker,Mingw,在代码::Blocks 13.12中,我使用向导通过启动一个新项目来创建一个DX9项目。我指定了DX文件夹,它没有问题。出现一个自动生成的.cpp,它被设置为GUI应用程序,文件未设置为只读模式,我点击编译: ||==编译:在xxxxxxxx中调试(编译器:GNU GCC编译器)===| c:\program files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.7.1……\libmingw32.a(main.o):main.c:(.text.startu

在代码::Blocks 13.12中,我使用向导通过启动一个新项目来创建一个DX9项目。我指定了DX文件夹,它没有问题。出现一个自动生成的.cpp,它被设置为GUI应用程序,文件未设置为只读模式,我点击编译:

||==编译:在xxxxxxxx中调试(编译器:GNU GCC编译器)===| c:\program files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.7.1……\libmingw32.a(main.o):main.c:(.text.startup+0xa7)| |未定义对`WinMain@16'| ||==生成失败:1个错误,0个警告(0分钟,2秒))===|

以下是自动生成的完整代码:

#include <windows.h>
#include <d3d9.h>
#define NOMINMAX
LPDIRECT3D9         g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // Our rendering device

HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    return S_OK;
}

VOID Cleanup()
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}

VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here

        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0, 0,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        "D3D Tutorial", NULL
    };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              NULL, NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        // Enter the message loop
        MSG msg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}
#包括
#包括
#定义NOMINMAX
LPDIRECT3D9 g_pD3D=NULL;//用于创建D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//我们的渲染设备
HRESULT InitD3D(HWND HWND)
{
如果(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_版本)))
返回E_失败;
D3D当前参数d3dpp;
零内存(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=d3dswapeeffect_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_未知;
如果(失败)(g_pD3D->CreateDevice(D3DAAPTER_默认值,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp和g_PD3D设备)
{
返回E_失败;
}
返回S_OK;
}
空洞清理()
{
如果(g_pd3dDevice!=NULL)
g_pd3dDevice->Release();
如果(g_pD3D!=NULL)
g_pD3D->Release();
}
VOID Render()
{
if(NULL==g_pd3dDevice)
回来
//将backbuffer清除为蓝色
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_目标,D3DCOLOR_XRGB(0,0,255),1.0f,0);
//开演
如果(成功(g_pd3dDevice->BeginScene())
{
//场景对象的渲染可以在此处进行
//结束现场
g_pd3dDevice->EndScene();
}
//向显示器显示backbuffer内容
g_pd3dDevice->Present(空,空,空,空);
}
LRESULT WINAPI MsgProc(HWND HWND、UINT msg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(msg)
{
案例WM_销毁:
清理();
PostQuitMessage(0);
返回0;
案例WM_油漆:
Render();
验证(hWnd,NULL);
返回0;
}
返回DefWindowProc(hWnd、msg、wParam、lParam);
}
INT WINAPI wWinMain(HINSTANCE hInst、HINSTANCE、LPWSTR、INT)
{
//注册窗口类
WNDCLASSEX wc=
{
sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,NULL,
“D3D教程”,空
};
注册类别(&wc);
//创建应用程序的窗口
HWND HWND=CreateWindow(“D3D教程”、“D3D教程01:CreateDevice”,
WS_重叠窗口,100100300300,
NULL,NULL,wc.hInstance,NULL);
//初始化Direct3D
if(成功(InitD3D(hWnd)))
{
//显示窗口
显示窗口(hWnd、SW_显示默认值);
更新窗口(hWnd);
//输入消息循环
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
}
取消注册类(“D3D教程”,wc.hInstance);
返回0;
}
在回答可能已经解决的相同问题之前,这里是已经尝试过的:

1.重启代码::块;仍然给出相同的错误

2.尝试GUI和控制台;仍然给出相同的错误

3.以空白申请书审理;仍然给出相同的错误

4.尝试使用Windows GUI应用程序;仍然给出相同的错误


保证DX SDK已安装,运行时是最新的,以及相关的所有其他内容。关于此问题的任何其他建议?

替换此Microsoft怪物:

INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )

使用此标准C++代码:

int main()
就这样

您的代码似乎已经为标准的
main
编写,例如,您正在使用
GetModuleHandle(0)
而不是
wWinMain
中的
hInst



如果您想要UTF-16编码的进程命令行,只需调用
GetCommandLine
,并可能调用
CommandLineToArgvW
(IIRC)来解析它。MinGW-64通过一个特殊选项支持wmain。但是有了上面提到的两个函数,您可以在五到六行代码中实现
wmain
支持,所以这并不重要,我更愿意编写代码,而不是使用一个模糊的选项。

入口点没有什么区别。实际上,我刚刚注意到您正在使用mingw。不幸地你必须改用WinMain。哦,我想那已经过时了。现在似乎有人支持它,请尝试将
-municode
传递给mingw。我尝试了上述两种建议,但它仍然会给出相同的错误。等等,如果您尝试编译一个像
int-WINAPI WinMain(…){return 0;}
这样的最小程序,它仍然会抱怨相同的错误吗?