我正在尝试编译图书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
答案 0 :(得分:1)
你不应该重新定义WinMainCRTStartup
,除非你在极少数情况下特别需要这样做(这里似乎不是这种情况) - 你需要WinMain。
答案 1 :(得分:0)
错误消息告诉您,您有两个WinMainCRTStartup()
函数,您定义的函数以及您要链接的运行时中的函数。
另一方面,你根本没有定义WinMain()
。 Mehrdad是正确的,你应该调用你的主函数WinMain()
。
您是否使用与您用作参考的书籍相同的工具集(编译器,链接器等)进行编译?不同的工具集名称略有不同,但总会有某种主要功能。
您不应该试图让代码的主要功能命名与本书完全一致。你应该得到它以匹配你的工具集所期望的。
答案 2 :(得分:0)
在命令行上编译时,我遇到此确切错误:
错误:
gcc -x c MyCFile.CustomExtension -o object_file.o -m64 -std=c11
gcc -o EXE.exe object_file.o
./EXE.exe
正确:
gcc -x c -c MyCFile.CustomExtension -o object_file.o -m64 -std=c11
gcc -o EXE.exe object_file.o
./EXE.exe
DIFF:
-c