2013-06-28 7 views
3

예 이미 Stackoverflow에 LNK2001에 관한 게시물이 수백 개 있다는 것을 알고 있습니다. 그러나 그들 중 누구도 내 문제를 해결하지 못했습니다. 그래서 여기에 해결책을 게시합니다.LIBCMT.lib : 오류 LNK2001 : 확인되지 않은 외부 기호 _main

증상 : ATL DLL이 디버그로 정상적으로 컴파일되지만 위의 오류가 릴리스로 컴파일되어 실패합니다.

인터넷에서 한 시간 동안 붙어서 "main() 함수를 정의 했습니까?"와 같은 쓸데없는 힌트를 찾았습니까? 내 구체적인 문제에 대한 솔루션을 게시해야한다고 생각합니다.

+0

시도해 보았습니다. –

+0

@ 엘림 - 이걸 Q & self-A 페어로 리팩터링하고, 나는 그것에 대해 upvote를 줄 수 있습니다 ... (심지어 두 개의 upvotes,) – LThode

+0

맞습니다. 나는 그렇게했다. – Elmue

답변

1

중요 : LNK2001에는 수백만 가지 원인이있을 수 있습니다! http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx

다음 가능한 한 검색에 많은 키워드를 포함하는 인식 :

내 솔루션은 특정 경우에 도움이 페이지도를 않는 경우하지 않는 경우

. 내 경우처럼 "LIBCMT.lib LNK2001 _main". 수백만 가지 검색 결과에 익사하는 것을 피하는 것이 중요합니다.

LIBCMT.LIB는 CRT 기능인 memcpy, swprintf 등과 같은 기능을 정의합니다. (C 런타임 라이브러리)

저는이 프로젝트 중 일부를 사용합니다. 그렇다면 왜 디버그 버전 빌드와 릴리스 버전이 아닌가?

원인은 CRT 시작 코드가 EXE 파일, DLL에에서 제외됩니다

프로젝트가 _ATL_MIN_CRT를 정의하는 경우 (일반적으로 _main시)를 한 번 호출해야 시작 코드가의 CRT 라이브러리가 초기화를 필요로한다는 것이다 빌드를 릴리스하여 파일 크기를 줄입니다.

이 알고있는 해결책은 간단하다 :

솔루션 A)이 줄을 넣어 STDAFX.H 파일의 끝에 프로젝트 설정

솔루션 B)에서 제거 _ATL_MIN_CRT :

#undef _ATL_MIN_CRT 

그게 문제를 해결했습니다.

나는 내 수업의 시작 나는에 넣어 다른 프로젝트에서 내 수업을 재사용으로이 나는 즉시 경고가 표시됩니다 미래에 다른 프로젝트에 내 코드를 재사용하는 것을 보장

#ifdef _ATL_MIN_CRT 
    #error _ATL_MIN_CRT is not valid for this project 
#endif 

.

엘름