множественное определение WinMainCRTStartup - PullRequest
0 голосов
/ 30 марта 2011

Я пытался скомпилировать код, предоставленный Книгой Windows Graphics Programming Win32 GDI and DirectDraw. Я использую Dev C ++ IDE. Здесь идет код

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <tchar.h>
#include <assert.h>

void CenterText(HDC hDC, int x, int y, LPCTSTR szFace,
                LPCTSTR szMessage, int point)
{
  HFONT hFont = CreateFont(
    —point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
    0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,
    ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
    PROOF_QUALITY, VARIABLE_PITCH, szFace);
  assert(hFont);

  HGDIOBJ hOld = SelectObject(hDC, hFont);

  SetTextAlign(hDC, TA_CENTER | TA_BASELINE);

  SetBkMode(hDC, TRANSPARENT);
  SetTextColor(hDC, RGB(0, 0, 0xFF));
  TextOut(hDC, x, y, szMessage, _tcslen(szMessage));
  SelectObject(hDC, hOld);
  DeleteObject(hFont);
}

const TCHAR szMessage[] = _T("Hello, World");
const TCHAR szFace[]    = _T("Times New Roman");

#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-align:512")

extern "C" void WinMainCRTStartup()
{
  HDC hDC = GetDC(NULL);
  assert(hDC);

  CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
    GetSystemMetrics(SM_CYSCREEN) / 2,
    szFace, szMessage, 72);

  ReleaseDC(NULL, hDC);
  ExitProcess(0);
}

Когда я компилирую, я получаю следующие ошибки

multiple definition of `WinMainCRTStartup' 
first defined here 
[Linker error] undefined reference to `WinMain@16' 
ld returned 1 exit status 
C:\Dev-Cpp\Projects\Win32GDIBasic2\Makefile.win [Build Error]  [Win32GDIBasic2.exe] Error 1 

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Вы не должны переопределять WinMainCRTStartup, если только вам не требуется делать это в редких случаях (что, похоже, не так) - вам нужно WinMain .

0 голосов
/ 30 марта 2011

Сообщения об ошибках сообщают вам, что у вас есть две WinMainCRTStartup() функции, одна из которых вы определяете, и одна во время выполнения, с которой вы связываетесь.

С другой стороны, вы вообще не определили WinMain(). Mehrdad правильно, вы должны вызвать вашу основную функцию WinMain().

Собираете ли вы тот же набор инструментов (компилятор, компоновщик и т. Д.), Что и книгу, которую вы используете в качестве справочной? Разные наборы инструментов имеют несколько разные имена, хотя всегда будет какая-то основная функция.

Вы не должны пытаться добиться того, чтобы названия основных функций вашего кода полностью соответствовали книге. Вы должны получить его в соответствии с тем, что ожидает ваш набор инструментов.

...