본문 바로가기

Projects/CoVNC

error LNK2001: unresolved external symbol _main

출처 : http://jof4002.net/?%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6%C6%C1/%C4%C4%C6%C4%C0%CF%BF%A1%B7%AFLNK2001

음... 별게 아니라 안쓸려고 했는데... -_-;
error LNK2001: unresolved external symbol _main

질문란에도 잊을만하면 올라오는 질문이더군요. 이 에러가 발생하는 경우는 크게 두가지가 있습니다.


--------------------------------------------------------------------------------

1. API로 프로그래밍을 처음 하시는 분들이 흔히 하는 실수 같습니다.

윈도우에서 프로그램은 크게 두가지로 분류할 수 있습니다. 도스처럼 console 창에 텍스트만을 출력하는 console 프로그램과 흔히 쓰는 GUI를 가진 프로그램이 있죠. (에구 이걸 뭐라고 해야 하나... 그냥 GUI 프로그램이라고 쓸께요)

Visual C++에서 프로젝트를 만들 때 Win32 Application : WinMain 함수에서 시작하게 되는 GUI 프로그램 Win32 Console Application : main 함수에서 시작하는 console 프로그램 이 두가지가 있습니다.

제목에 적은 것 같은 에러가 나는 분들은 대부분 GUI 프로그램을 만드시려고 하고 WinMain은 만드셨는데, 프로젝트를 만들 때 console application을 선택하신겁니다. 반대로 WinMain이 없다고 에러가 나오면 GUI 프로젝트를 선택하고서 main 함수를 작성하신 것이겠죠.

자, 그럼 어떻게 해결하느냐. 설정을 바꿔주면 됩니다. 프로젝트 세팅(Alt + F7)에서 Link탭을 누르면 제일 아래에 에디트 박스가 보이죠? 잘 보면 /subsystem:console 이라고 써있을 겁니다. 이걸 /subsystem:windows로 바꿔주세요. (또는 상황에 따라서 그 반대로 해줄 수도 있겠죠) 이 옵션의 역할은 링커에게 있어서 이 프로그램이 어떤 함수로부터 시작해야 하는지를 알려주는 겁니다. 이 옵션이 console이라면 main을, windows라면 WinMain을 찾아서 그 함수에서부터 프로그램이 시작하게 하는거죠.

아시겠죠? 잘 이해가 안되면 질문 달아주세요. 성실히 답변해드리겠습니다. 그리고 Jeffrey Ritcher 아저씨가 쓴 Programming Applications for Windows 4th. 를 보면 잘 나와 있으니 참고하세요.


--------------------------------------------------------------------------------

2. ATL에서 컨트롤을 만들 때 이 에러가 날 수 있습니다.

디버그에서는 잘 컴파일이 되던게 릴리즈로 빌드하면 저 에러가 날 수 있습니다. ATL에서는 생성되는 코드의 크기를 최소화 하기 위해서 CRT (C RunTime) 함수의 일부를 제한하고 있기 때문이죠(정확히 말하자면 start up 코드를 넣지 않습니다). 그런데 프로젝트에서 특정 C 함수를 사용하면 ATL에서 제한한 CRT의 기능이 필요해지고 따라서 에러가 나는겁니다.

이 해결책도 간단합니다. a. 프로젝트 세팅에서 predefined keyword를 찾아서 _ATL_MIN_CRT를 지워주세요. b. 초기화가 필요한 CRT 함수를 사용하지 마세요. -_-; MSDN에 따르면 strcmp대신 lstrcmp를 사용하는 식으로 피해갈 수 있다고 합니다.

자세한건 MSDN에서 _ATL_MIN_CRT를 찾아보세요. (색인에서 입력하면 나옵니다.)