섹션 섹션 이 있습니다. 처리되지 않은 정적 이니셜라이저 또는 종결자가 있을 수 있습니다.
설명
일부 코드는 정적 이니셜라이저 또는 종결자를 도입했지만 VCRuntime 라이브러리 시작 코드 또는 해당 코드(정적 이니셜라이저 또는 종결자를 실행해야 하는)는 애플리케이션이 시작될 때 실행되지 않습니다. 다음은 정적 이니셜라이저 또는 종결자가 필요한 코드의 몇 가지 예입니다.
생성자, 소멸자 또는 가상 함수 테이블이 있는 전역 클래스 변수입니다.
비 컴파일 시간 상수로 초기화된 전역 변수입니다.
이 문제를 해결하려면 다음 중 하나를 시도합니다.
정적 이니셜라이저를 사용하여 모든 코드를 제거합니다.
/NOENTRY를 사용하지 마세요. /NOENTRY를 제거한 후 링커 명령줄에서 /NODEFAULTLIB를 제거해야 할 수도 있습니다.
빌드에서 /MT를 사용하는 경우 libcmt.lib, libvcruntime.lib 및 libucrt.lib를 링커 명령줄에 추가합니다. 빌드에서 /MTd를 사용하는 경우 libcmtd.lib, vcruntimed.lib 및 libucrtd.lib를 추가합니다.
/clr:pure 컴파일에서 /clr로 이동하는 경우 링커 줄에서 /ENTRY 옵션을 제거합니다. 이렇게 하면 CRT 초기화가 가능하며 애플리케이션 시작 시 정적 이니셜라이저를 실행할 수 있습니다. /clr:pure 컴파일러 옵션은 Visual Studio 2015에서 더 이상 사용되지 않으며 Visual Studio 2017에서는 지원되지 않습니다.
/GS 컴파일러 옵션을 사용하려면 함수를 __security_init_cookie
초기화해야 합니다. 이 초기화는 기본적으로 에서 실행되는 VCRuntime 라이브러리 시작 코드에서 _DllMainCRTStartup
제공됩니다.
- /ENTRY을 사용하여 프로젝트를 빌드하고 /ENTRY이 아닌
_DllMainCRTStartup
다른 함수를 전달하는 경우 함수는 CRT를 초기화하기 위해 호출_CRT_INIT
해야 합니다. DLL에서 /GS를 사용하거나, 정적 이니셜라이저가 필요하거나, MFC 또는 ATL 코드의 컨텍스트에서 호출되는 경우 이 호출만으로는 충분하지 않습니다. 자세한 내용은 DLL 및 Visual C++ 런타임 라이브러리 동작을 참조하세요.