普通にwin32プロジェクトを作成
/NODEFAULTLIBオプションを有効に、これでCRTはリンクされない。
ビルドするといろいろリンクエラー、これはCRTの機能を呼んでいるから出る。
1 2 3 4 5 6 7 8 |
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をデフォルトに
ビルド
1 2 3 4 |
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 |
1 2 |
LINK : error LNK2001: unresolved external symbol _wWinMainCRTStartup C:\T\noCRTTest\Debug\noCRTTest.exe : fatal error LNK1120: 1 unresolved externals |
以下を定義
1 2 3 4 |
void wWinMainCRTStartup() { ExitProcess(_tWinMain(GetModuleHandle(NULL),NULL, NULL, SW_SHOW)); } |
これでビルドできて動いた。しかしmemsetを使っていると問題がある。
1 |
TCHAR szT[MAX_PATH] = {0}; |
このようなコードでもコンパイラはmemsetを呼ぶようで、これが見つからないと怒られる。自分で定義する。
1 2 3 4 5 6 7 |
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の関数を定義するなと怒られる。その場合は以下のプラグマで回避する
1 2 |
#pragma intrinsic(memset) #pragma function(memset) |