오류 LNK2019 : ___tmainCRTStartup 함수에서 참조 된 해결되지 않은 외부 기호 _WinMain @ 16


143

아래와 같이 간단한 코드를 실행하는 동안 다음과 같은 두 가지 오류가 있습니다.

#include <iostream>
#include <string>
using namespace::std;

template <class Type>
class Stack
{
public:
    Stack (int max):stack(new Type[max]), top(-1), maxsize(max){}
    ~Stack (void) {delete []stack;}
    void Push (Type &val);
    void Pop (void) {if (top>=0) --top;}
    Type& Top (void) {return stack[top];}
    //friend ostream& operator<< (ostream&, Stack&);
private:
    Type *stack;
    int top;
    const int maxSize;
};

template <class Type>
void Stack <Type>:: Push (Type &val)
{
    if (top+1<maxsize)
        stack [++top]=val;
}

오류 :

MSVCRTD.lib (crtexew.obj) : 오류 LNK2019 : _WinMain@16함수에서 참조 된 확인할 수 없는 외부 기호___tmainCRTStartup

어떻게해야합니까?


1
이것이 모든 코드입니까? 주요 기능은 어디에 있습니까?
Connman

2
또한 프로젝트 유형이 잘못 설정된 것 같습니다. WinMain 관련 링커 오류는 Win32 프로젝트를 만들려고했음을 나타냅니다. 명령 프롬프트에 텍스트를 출력하려는 ​​경우 프로젝트 유형을 콘솔로 변경하십시오.
Kilanash

4
그건 그렇고, 컴파일러 / 링커 오류가 발생하면 코드를 "실행 중"이 아닙니다.
André Caron

1
프로젝트 유형을 변경하려고 시도했지만 콘솔 대신 project = exe가 작동했습니다.
Dom

답변:


352

링커 문제입니다.

Visual Studio에서 속성-> 링커-> 시스템-> 하위 시스템을 변경하십시오.

에서 윈도우 (/ SUBSYSTEM : WINDOWS)콘솔 (/ SUBSYSTEM : CONSOLE)

이것은 나를 도와


3
나는 같은 문제가 있습니다. 당신의 대답은 도움이되지 않습니다. 다른 제안?
Parth Sane

1
MS Visual Studio를 사용할 때 그 문제가 발생했습니다. 환경이 다르면 다르게 수정해야 할 수도 있습니다. 그러나 여전히 링커 문제 여야합니다.
Bohdan

2
당신이 사용하는 경우 tWinMain당신의 주요 기능, 당신은 tchar.h 포함해야 또는 하나에 변경 WinMain또는 wWinMain앱이 유니 코드인지 여부에 따라 달라집니다. 그렇지 않으면 올바른 서브 시스템에서도이 링커 오류가 발생합니다. (/ SUBSYSTEM : WINDOWS)
리사

이것은 또한 Avast 안티 바이러스 를 비활성화해야한다는 것 외에도 도움이되었습니다 .
XCS

1
이것은 플랫폼과 유형 모두에 대해 "모든 구성"을 선택한 후에 만 ​​작동했습니다. "솔루션"에서 "빌드"를 선택하면 모두 빌드가 시도되었으며 첫 번째 시도는 콘솔 서브 시스템에 지정된 것이 아닙니다.
Joseph Stateson

83

다른 사람들이 언급했듯이 하위 시스템을 콘솔로 변경할 수 있으며 오류가 사라집니다.

또는 Windows 하위 시스템을 유지하려면을 정의하지 않았으므로 진입 점을 암시 할 수 있습니다 ___tmainCRTStartup. 특성-> 링커-> 명령 행에 다음을 추가하여이를 수행 할 수 있습니다 .

/ ENTRY : "mainCRTStartup"

이렇게하면 콘솔 창을 제거 할 수 있습니다.


3
+1 : "이렇게하면 콘솔 창을 없앨 수 있습니다." - 멋있는! sth를 배웠다. 오늘 새로운!
Valentin Heinitz

1
SFML와 난 그냥 GLFW으로, 서브 시스템 윈도우를 지정할 수 있기 때문에 조언 +1, 난 분명히 differen't 것으로, 20와 같은 분 동안이 문제를 알아 내려고 노력했다 (덕분에 너무 =
다니엘

14

이 문제점이 있고 Qt를 사용중인 경우 qtmain.lib 또는 qtmaind.lib를 링크해야합니다.


프로젝트-> 속성-> 링커-> 입력에 있습니다. 추가 $(QTDIR)\lib\qtmaind.lib종속성에 추가하십시오 .
mathiasfk

1
추가 CONFIG += console받는 .pro파일 내 Qt는 프로젝트에 대한 문제를 해결
Synck

12

Console (/SUBSYSTEM:CONSOLE)다른 사람들이 말한 것처럼 변경하는 것 외에도 속성-> 링커-> 고급-> 진입 점 에서 진입 점 을 변경해야 할 수도 있습니다 . mainCRTStartup으로 설정하십시오 .

달리 지정하지 않으면 Visual Studio가 main 대신 WinMain 함수를 검색하는 것 같습니다.


10

다음 <tchar.h>줄을 포함하십시오 .

#define _tWinMain wWinMain

7

유니 코드 문자 집합을 사용하지만 항목이 설정되지 않은 경우 / ENTRY를 지정할 수 있습니다. "wWinMainCRTStartup"


나를위한 생명의 은인! 나는 cmake + mfc (unicode)를 사용했다
malat

4

주요 기능이 보이지 않습니다.

주요 기능이 있는지 확인하십시오.

예 :

int main(int argc, TCHAR *argv[]){

}

그것이 잘 작동하기를 바랍니다. :)


도움이되지 않습니다. 링커가 정의되지 않은 WinMain 진입 점 에 대해 불평하고 있습니다. 라는 진입 점을 정의 main해도 문제가 해결되지 않습니다.
IInspectable

링커가 다른 main/ WinMain버전 을 해결하려고 시도하고 발견 되지 않으면 WinMain @ 16 not found 라고 표시되지만이 메시지는 정확하지 않습니다.
Lorinczy Zsigmond 2018 년

3

프로젝트가 Dll이면 링커가 콘솔 프로그램을 빌드하려고 할 수 있습니다. 프로젝트 속성을 엽니 다. 일반 설정을 선택하십시오. 구성 유형 동적 라이브러리 (.dll)를 선택하십시오.


나는 그 문제를 정확히 가지고 있지만 .dll컴파일러가 설정되어 있지만 여전히 Windows 앱을 빌드하려고합니다.
Tomáš Zato-복원 모니카

3

나는이 답변을 어디에 게시 해야할지 잘 모르겠지만 그것이 올바른 장소라고 생각합니다. 오늘이 오류가 발생하여 하위 시스템을 전환해도 아무런 변화가 없었습니다.

64 비트 lib 파일을 32 비트 (x86)로 변경하면 트릭이 나에게 도움이되기를 바랍니다.


동일한 대상에 대한 종속성을 다시 컴파일해도 효과가 있지만 이것을 시도하고 작동했습니다.
Jamie Nicholl-Shelley

또한 나를 위해 일한 ... 단위 테스트 마법사가 32 비트 진입 점을 사용하는 것 같습니다
Erik Aronesty

3

실제로 main () 대신 _tWinMain () 을 사용하려면 프로젝트 관련 구성이 있는지 확인하십시오.

  1. 링커-> 시스템-> 하위 시스템 => Windows (/ SUBSYSTEM : WINDOWS)
  2. C / C ++-> 전 처리기-> 전 처리기 정의 => _CONSOLE을 _WINDOWS로 바꿉니다.
  3. _tWinMain () 이 정의 된 c / cpp 파일에서 다음을 추가하십시오.

    #include <Windows.h> #include <tchar.h>


2

필수 입력 지점 인 main함수가 정의되어 있지 않기 때문에 소스 파일을 실행 파일로 바꾸려고했습니다 . main.cpp 파일을 추가하고 주요 기능을 정의하십시오. 커맨드 라인에서 작업하는 경우 (의문의 여지가 있음) /c컴파일하지 않고 링크하지 않고 추가 할 수 있습니다 . 이것은 정적 또는 공유 라이브러리 또는 응용 프로그램에 연결 해야하는 객체 파일 만 생성합니다 (이 경우 main이 정의 된 oject 파일이 필요합니다).

_WinMainmain연결할 때 의 Microsoft 이름입니다 .

또한 : 아직 코드를 실행하지 않고 컴파일 및 링크하고 있습니다. C ++는 해석 언어가 아닙니다.


5
실제로 그는 WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)진입 점이 필요합니다 . 이 링커 오류는 프로젝트가 콘솔 서브 시스템이 아닌 Windows 서브 시스템 용으로 빌드되고 있음을 나타냅니다.
Adam Maras

@ 아담 : 아 예, 나는 Qt에 의해 버릇이되었습니다 :) (효과적으로 WinMain을 숨 깁니다).
rubenvb

WinMain은 Windows 응용 프로그램 전용입니다. 콘솔 앱은 유니 코드 / MBCS 설정에 따라 다른 이름 _tmain을 사용하여 main 또는 wmain으로 확인됩니다.
Steve Townsend

@AdamMaras, 완벽합니다. 필요한 대문자와 프로토 타입을 찾고있었습니다. 이제 완벽하게 작동합니다. 감사!
Synetech

_WinMain@16Windows 하위 시스템을 대상으로 할 때 CRT에서 시작 코드가 호출하는 사용자 제공 진입 점의 장식 된 기호입니다. " main링크 할 때 의 Microsoft 이름" 이 아닙니다 . 콘솔 하위 시스템을 대상으로하는 경우 Visual Studio와 함께 제공되는 CRT는 이름이 지정된 진입 점을 호출합니다 main. 정의되지 않은 경우 링커는이라는 누락 된 심볼에 대해 불평 _main합니다.
IInspectable

1

CMake를 사용 SET(GUI_TYPE WIN32)하는 경우 콘솔 응용 프로그램에서 설정할 때이 오류가 발생할 수도 있습니다 .


1

위에서 언급 한에 루다이 트 제안은 사례의 99.99 %에서 문제를 해결합니다. 그들이하지 않은 것은 나의 행운이었다. 제 경우에는 다른 Windows 프로젝트의 헤더 파일을 포함하고있는 것으로 나타났습니다. 그 파일의 맨 아래에서 지시어를 찾았습니다.

#pragma comment(linker, "/subsystem:Windows")

말할 필요도없이,이 줄을 제거하면 내 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.