VC2008でCRTのないEXEを作成する

投稿者: | 2015/12/18 金曜日

普通にwin32プロジェクトを作成
clipshot 2015-12-18 00-00-44
/NODEFAULTLIBオプションを有効に、これでCRTはリンクされない。
clipshot 2015-12-18 00-03-05
ビルドするといろいろリンクエラー、これはCRTの機能を呼んでいるから出る。

noCRTTest.obj : error LNK2019: unresolved external symbol @_RTC_CheckStackVars@8 referenced in function _wWinMain@16
noCRTTest.obj : error LNK2019: unresolved external symbol __RTC_CheckEsp referenced in function _wWinMain@16
noCRTTest.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
noCRTTest.obj : error LNK2001: unresolved external symbol __RTC_InitBase
noCRTTest.obj : error LNK2019: unresolved external symbol ___security_cookie referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
noCRTTest.obj : error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
LINK : error LNK2001: unresolved external symbol _wWinMainCRTStartup
C:\T\noCRTTest\Debug\noCRTTest.exe : fatal error LNK1120: 7 unresolved externals

Basic Runtime Checkをデフォルトに
clipshot 2015-12-18 00-07-06
ビルド

noCRTTest.obj : error LNK2019: unresolved external symbol ___security_cookie referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
noCRTTest.obj : error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
LINK : error LNK2001: unresolved external symbol _wWinMainCRTStartup
C:\T\noCRTTest\Debug\noCRTTest.exe : fatal error LNK1120: 3 unresolved externals

Buffer Security CheckをNoに
clipshot 2015-12-18 00-08-53
ビルド

LINK : error LNK2001: unresolved external symbol _wWinMainCRTStartup
C:\T\noCRTTest\Debug\noCRTTest.exe : fatal error LNK1120: 1 unresolved externals

以下を定義

void wWinMainCRTStartup()
{
	ExitProcess(_tWinMain(GetModuleHandle(NULL),NULL, NULL, SW_SHOW));
}

これでビルドできて動いた。しかしmemsetを使っていると問題がある。

TCHAR szT[MAX_PATH] = {0};

このようなコードでもコンパイラはmemsetを呼ぶようで、これが見つからないと怒られる。自分で定義する。

void* memset(void* dist, int val, size_t size)
{
	BYTE* p = (BYTE*)dist;
	for(size_t i=0 ; i < size ; ++i, ++p)
		*p = val;
	return dist;
}

これでビルドできたがVC6だと今度はintrinsicの関数を定義するなと怒られる。その場合は以下のプラグマで回避する

#pragma intrinsic(memset)
#pragma function(memset)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です