Ответ 1
Проверьте конфигурацию проекта. Linker → Система → Подсистема должна быть Windows.
Код серьезности Описание Ошибка строки файла проекта LNK2019 неразрешенный внешний символ _main ссылается на функцию "int __cdecl invoke_main (void)" (? invoke_main @@YAHXZ) Код серьезности Описание Строка файла проекта Ошибка LNK1120 1 нерешенных внешних
#include "windows.h"
#include "tchar.h"
#include "d3d9.h"
#pragma comment(lib, "d3d9.lib")
LPDIRECT3D9 pDirect3D=NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice=NULL;
const int segment = 50;
const int NV = segment*13;
struct CUSTOMVERTEX
{
float x, y, z, rhv;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
LPDIRECT3DVERTEXBUFFER9 pVertexBuffer=NULL;
HRESULT InitialDirect3D(HWND hvnd)
{
if((pDirect3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
return E_FAIL;
D3DDISPLAYMODE Display;
if(FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParameter;
ZeroMemory(&Direct3DParameter, sizeof Direct3DParameter);
Direct3DParameter.Windowed=TRUE;
Direct3DParameter.SwapEffect=D3DSWAPEFFECT_DISCARD;
Direct3DParameter.BackBufferFormat=Display.Format;
if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hvnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&Direct3DParameter, &pDirect3DDevice)))
return E_FAIL;
return S_OK;
}
HRESULT RenderingDirect3D()
{
if(pDirect3DDevice==NULL)
return E_FAIL;
pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(90, 150, 100), 1.f, 0);
pDirect3DDevice->BeginScene();
pDirect3DDevice->SetStreamSource(0, pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pDirect3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, NV);
pDirect3DDevice->EndScene();
pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
return S_OK;
}
void DeleteDirect3D()
{
if(pVertexBuffer)
pVertexBuffer->Release();
if(pDirect3DDevice)
pDirect3DDevice->Release();
if(pDirect3D)
pDirect3D->Release();
}
HRESULT InitialVertexBuffer()
{
float u = 0.0;
int z = 0;
float points[][2] = {
{150,150},
{125,100},
{150,50},
{200,50},
{225,55},
{285,60},
{325,25},
{342,30},
{340,35},
{340,40},
{325,75},
{300,125},
{300,175},
{305,250},
{295,287},
{257,347},
{200,350},
{150,325},
{140,290},
{142,282},
{160,280},
{165,286},
{175,325},
{215,340},
{250,335},
{275,300},
{275,250},
{255,200},
{250,150},
{275,100},
{305,65},
{275,85},
{240,95},
{215,85},
{170,65},
{140,90},
{160,135},
{160,150},
{152.5,150},
{150,150}
};
CUSTOMVERTEX Vertexes[NV*2];
int i = 0;
while( i < NV*2 )
{
u = 0.f;
for(int j = 0; j < segment; j++)
{
Vertexes[i].x = (1-3*u+3*u*u-u*u*u)*points[z][0]+(3*u-6*u*u+3*u*u*u)*points[z+1][0]+(3*u*u-3*u*u*u)*points[z+2][0]+(u*u*u)*points[z+3][0];
Vertexes[i].y = (1-3*u+3*u*u-u*u*u)*points[z][1]+(3*u-6*u*u+3*u*u*u)*points[z+1][1]+(3*u*u-3*u*u*u)*points[z+2][1]+(u*u*u)*points[z+3][1];
Vertexes[i].z = 0.5f;
Vertexes[i].color = 0x00ffffff;
Vertexes[i].rhv = 1.f;
u += (float)1/segment;
i++;
Vertexes[i].x = (1-3*u+3*u*u-u*u*u)*points[z][0]+(3*u-6*u*u+3*u*u*u)*points[z+1][0]+(3*u*u-3*u*u*u)*points[z+2][0]+(u*u*u)*points[z+3][0];
Vertexes[i].y = (1-3*u+3*u*u-u*u*u)*points[z][1]+(3*u-6*u*u+3*u*u*u)*points[z+1][1]+(3*u*u-3*u*u*u)*points[z+2][1]+(u*u*u)*points[z+3][1];
Vertexes[i].z = 0.5f;
Vertexes[i].color = 0x00ffffff;
Vertexes[i].rhv = 1.f;
i++;
}
z += 3;
}
if(FAILED(pDirect3DDevice->CreateVertexBuffer(NV*2*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &pVertexBuffer, NULL)))
return E_FAIL;
void *pVB=NULL;
if(FAILED(pVertexBuffer->Lock(0, sizeof Vertexes, (void**)&pVB, 0)))
return E_FAIL;
memcpy(pVB, Vertexes, sizeof Vertexes);
pVertexBuffer->Unlock();
return S_OK;
}
LRESULT CALLBACK MainWinProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
switch(msg)
{
//
case WM_PAINT:
RenderingDirect3D();
ValidateRect(hwnd, NULL);
break;
case WM_DESTROY:
DeleteDirect3D();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX windowsclass;
HWND hwnd;
MSG msg;
//
windowsclass.cbSize=sizeof(WNDCLASSEX);
windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
windowsclass.lpfnWndProc=MainWinProc;
windowsclass.cbClsExtra=0;
windowsclass.cbWndExtra=0;
windowsclass.hInstance=hinstance;
windowsclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName=NULL;
windowsclass.lpszClassName=_T("WINDOWSCLASS");
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&windowsclass))
return 0;
if(!(hwnd=CreateWindowEx(
NULL,
_T("WINDOWSCLASS"),
_T("Desenam litera G"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0,
NULL,
NULL,
hinstance,
NULL)))
return 0;
if(SUCCEEDED(InitialDirect3D(hwnd)))
{
if(SUCCEEDED(InitialVertexBuffer()))
{
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
ZeroMemory(&msg, sizeof msg);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
RenderingDirect3D();
}
}
}
return msg.wParam;
}
Проверьте конфигурацию проекта. Linker → Система → Подсистема должна быть Windows.
Если вы используете CMake, вы должны установить флаг WIN32 в add_executable
add_executable(${name} WIN32 ${source_files})
Подробнее см. Документ CMake.
У меня тоже была проблема, и я узнал, что выбрал "новое приложение Win32" вместо "нового консольного приложения Win32". Проблема решена, когда я переключился. Надеюсь, это поможет вам.
Аналогично @仲耀晖 у меня был неправильный тип приложения, настроенный для dll. Я предполагаю, что тип проекта изменился из-за некорректного копирования вставки, как предположил @Daniel Struhl.
Как проверить:
Щелкните правой кнопкой мыши по проекту → properties
→ Configuration Properties
→ General
→ Project Defaults
→ Configuration Type
.
Проверьте, содержит ли это поле правильный тип, например. "Dynamic Library (.dll)" в случае, если проект является dll.
Щелкните правой кнопкой мыши на проекте. Properties-> Конфигурация Properties-> General-> Linker.
Я нашел два варианта, которые необходимо установить. В разделе Система: Подсистема = Windows (/SUBSYSTEM: WINDOWS) В разделе Дополнительно: EntryPoint = основной
У меня была та же проблема, когда я пытался создать исполняемый файл из программы, которая не имеет метода main(). Когда я включил образец метода main(), как это
int main(){
return 0;
}
Решено
Выберите проект. Properties-> Конфигурация Properties-> Линкер-> Система.
Моя проблема решена путем установки ниже опции. Под Системой: Подсистема = Консоль (/SUBSYSTEM: КОНСОЛЬ)
Или вы можете выбрать последний вариант как "наследовать от родителя".
или просто используйте main() вместо WinMain
Это крайний случай, но вы также можете получить эту ошибку, если вы создаете приложение MFC с CMake.
В этом случае вам необходимо добавить следующие определения:
ADD_DEFINITIONS(-D_AFXDLL) SET(CMAKE_MFC_FLAG 2) # or 1 if you are looking for the static library
Если вы компилируете с Unicode, следующие свойства также должны быть добавлены:
set_target_properties(MyApp PROPERTIES COMPILE_DEFINITIONS _AFXDLL,_UNICODE,UNICODE,_BIND_TO_CURRENT_CRT_VERSION,_BIND_TO_CURRENT_MFC_VERSION LINK_FLAGS "/ENTRY:\"wWinMainCRTStartup\"" )
Решение для меня таково: я очищаю и решение, и проект. И просто перестроить проект. Эта ошибка возникает из-за того, что я пытался удалить основной файл (только файлы библиотеки) в предыдущей сборке, поэтому при текущей сборке старый материал все еще сохраняется в каталоге сборки. Вот почему произошли нерешенные вещи. "неразрешенный внешний символ _main, указанный в функции" int __cdecl invoke_main (void) "(? invoke_main @@YAHXZ)"