C++ 另一个未定义的引用WinMain@16问题
在代码::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秒))===| 以下是自动生成的完整代码: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
#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;}
这样的最小程序,它仍然会抱怨相同的错误吗?