błąd LNK2019: nierozwiązany symbol zewnętrzny _WinMain @ 16, do którego odwołuje się funkcja ___tmainCRTStartup


143

Podczas gdy używam prostego kodu, jak poniżej, mam dwa następujące błędy:

#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;
}

Błędy:

MSVCRTD.lib (crtexew.obj): błąd LNK2019: nierozwiązany symbol zewnętrzny, do którego _WinMain@16odwołuje się funkcja___tmainCRTStartup

Co powinienem zrobić?


1
Czy to cały kod? Gdzie jest twoja główna funkcja?
Connman,

2
Wygląda też na to, że typ projektu jest nieprawidłowy. Błąd konsolidatora dotyczący WinMain sugeruje, że próbowałeś utworzyć projekt Win32. Jeśli chcesz, aby coś wyświetlało tekst w wierszu polecenia, spróbuj zmienić typ projektu na Console.
Kilanash,

4
Nawiasem mówiąc, jeśli otrzymujesz błędy kompilatora / konsolidatora, nie „uruchamiasz” kodu.
André Caron

1
Próbowałem zmienić typ projektu, ale project = exe działał zamiast konsoli.
Dom

Odpowiedzi:


352

To jest problem konsolidatora.

Spróbuj zmienić Właściwości -> Konsolidator -> System -> Podsystem (w programie Visual Studio).

z Windows (/ SUBSYSTEM: WINDOWS) do konsoli (/ SUBSYSTEM: CONSOLE)

Ten mi pomógł


3
Mam ten sam problem. Twoja odpowiedź nie pomaga. Jakieś inne sugestie?
Parth Sane

1
Miałem ten problem podczas korzystania z MS Visual Studio. Jeśli twoje środowisko jest inne, być może będziesz musiał to naprawić w inny sposób. Ale nadal powinien to być problem z linkerem.
Bohdan

2
Jeśli używasz tWinMainjako głównej funkcji, musisz dołączyć tchar.h lub zmienić go na jedną WinMainlub w wWinMainzależności od tego, czy Twoja aplikacja jest zgodna z Unicode. Niespełnienie tego warunku powoduje również błąd konsolidatora, nawet z poprawnym podsystemem. (/ SUBSYSTEM: WINDOWS)
lisa

Pomogło mi to, poza tym musiałem też wyłączyć antywirusa Avast .
XCS

1
To zadziałało dopiero po wybraniu „wszystkich konfiguracji” zarówno dla platformy, jak i typu. Wybierając opcję „buduj” w „rozwiązaniu”, podjęto próbę zbudowania wszystkiego, a pierwsza próba NIE była tym, który został określony dla podsystemu konsoli.
Joseph States,

83

Jak wspominali inni, możesz zmienić podsystem na konsolę, a błąd zniknie.

Lub jeśli chcesz zachować podsystem Windows, możesz po prostu wskazać, jaki jest twój punkt wejścia, ponieważ nie zdefiniowałeś ___tmainCRTStartup. Możesz to zrobić, dodając do Właściwości -> Konsolidator -> Wiersz poleceń :

/ ENTRY: "mainCRTStartup"

W ten sposób pozbędziesz się okna konsoli.


3
+1: „W ten sposób pozbędziesz się okna konsoli”. - Chłodny! Learned sth. nowy dzisiaj!
Valentin Heinitz

1
+1 za radę, próbowałem to rozgryźć przez jakieś 20 minut, ponieważ z SFML mogę po prostu określić podsystem Windows, Z GLFW, który oczywiście różni się tak, dziękuję (=
daniel

14

Jeśli masz ten problem i używasz Qt - musisz połączyć qtmain.lib lub qtmaind.lib


To na Projekt -> Właściwości -> Konsolidator -> Dane wejściowe. Dodaj $(QTDIR)\lib\qtmaind.libdo dodatkowych zależności.
mathiasfk

1
Dodanie CONFIG += consoledo .propliku rozwiązało problem z moim projektem Qt
Synck

12

Oprócz zmiany na Console (/SUBSYSTEM:CONSOLE)tak, jak powiedzieli inni, może być konieczna zmiana punktu wejścia w Właściwości -> Konsolidator -> Zaawansowane -> Punkt wejścia. Ustaw go na mainCRTStartup .

Wygląda na to, że Visual Studio może szukać funkcji WinMain zamiast main, jeśli nie określisz inaczej.


10

Uwzględnij, <tchar.h>który ma wiersz:

#define _tWinMain wWinMain

7

Jeśli używasz zestawu znaków Unicode, ale wpis nie został ustawiony, możesz określić / ENTRY: „wWinMainCRTStartup”


ratunek dla mnie!
Używałem

4

nie widzę głównej funkcji.

Upewnij się, że ma główną funkcję.

przykład:

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

}

mam nadzieję, że działa dobrze. :)


To nie pomaga. Konsolidator skarży się na niezdefiniowany punkt wejścia WinMain . Zdefiniowanie wywoływanego punktu wejścia mainnie rozwiązuje tego problemu.
Niespodziewany

Linker próbuje rozwiązać różne wersje main/ WinMain, a jeśli żadna z nich nie zostanie znaleziona, mówi, że WinMain @ 16 nie został znaleziony , ale ta wiadomość nie jest dokładnie poprawna.
Lorinczy Zsigmond

3

Jeśli twój projekt to Dll, może się zdarzyć, że konsolidator chce zbudować program konsoli. Otwórz właściwości projektu. Wybierz Ustawienia ogólne. Wybierz tam typ konfiguracji Dynamic Library (.dll).


Mam dokładnie ten problem, ale chociaż .dllkompilator jest ustawiony, nadal próbuje zbudować aplikację dla systemu Windows.
Tomáš Zato - Przywróć Monikę

3

Nie jestem pewien, gdzie opublikować moją odpowiedź, ale myślę, że to właściwe miejsce. Natknąłem się dzisiaj na ten błąd i przełączenie podsystemów nic nie zmieniło.

Zmiana 64-bitowych plików lib na 32-bitowe (x86) załatwiła mi sprawę, mam nadzieję, że komuś tam pomoże!


Wypróbowałem to i zadziałało, chociaż działa również rekompilacja zależności do tych samych celów.
Jamie Nicholl-Shelley

też działał dla mnie ... wygląda na to, że kreator testów jednostkowych używa 32-bitowego punktu wejścia
Erik Aronesty

3

Jeśli faktycznie chcesz użyć _tWinMain () zamiast main (), upewnij się, że masz odpowiednią konfigurację dla twojego projektu

  1. Linker-> System -> SubSystem => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Preprocessor -> Preprocessor Definitions => Replace _CONSOLE with _WINDOWS
  3. W pliku c / cpp, w którym zdefiniowano _tWinMain () , dodaj:

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


2

Próbowałeś przekształcić ten plik źródłowy w plik wykonywalny, co oczywiście nie jest możliwe, ponieważ obowiązkowy punkt wejścia, mainfunkcja, nie jest zdefiniowana. Dodaj plik main.cpp i zdefiniuj główną funkcję. Jeśli pracujesz w wierszu poleceń (w co wątpię), możesz dodać /ctylko kompilację, a nie link. Spowoduje to utworzenie tylko pliku obiektowego, który musi być połączony z biblioteką statyczną lub współdzieloną lub aplikacją (w takim przypadku będziesz potrzebować pliku oject ze zdefiniowanym main).

_WinMainto nazwa firmy Microsoft mainpodczas łączenia.

Ponadto: jeszcze nie uruchamiasz kodu, kompilujesz go (i łączysz). C ++ nie jest językiem interpretowanym.


5
Właściwie potrzebuje WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)punktu wejścia. Ten błąd konsolidatora wskazuje, że projekt jest budowany dla podsystemu Windows, a nie podsystemu konsoli.
Adam Maras

@Adam: ach tak, zostałem rozpieszczony przez Qt :) (co skutecznie ukrywa przed tobą WinMain).
rubenvb

WinMain jest przeznaczony tylko dla aplikacji Windows. Aplikacje konsolowe używają innej nazwy _tmain, która jest zastępowana nazwą main lub wmain w zależności od ustawienia Unicode / MBCS.
Steve Townsend

@AdamMaras, doskonale. Szukałem wymaganej kapitalizacji i prototypu. Teraz działa idealnie. Dzięki!
Synetech

_WinMain@16to ozdobiony symbol punktu wejścia podanego przez użytkownika, wywoływanego przez kod startowy w CRT, gdy jest przeznaczony dla podsystemu Windows. To nie jest „nazwa firmy Microsoft do tworzenia mainlinków” . Jeśli celujesz w podsystem konsoli, CRT dostarczany z programem Visual Studio wywoła punkt wejścia o nazwie main. Jeśli jest niezdefiniowany, konsolidator będzie narzekał na brakujący symbol o nazwie _main.
Niespodziewany

1

Jeśli używasz CMake, możesz również otrzymać ten błąd podczas ustawiania SET(GUI_TYPE WIN32)w aplikacji konsoli.


1

Wspomniane wyżej erudycyjne sugestie rozwiążą problem w 99,99% przypadków. Miałem szczęście, że nie. W moim przypadku okazało się, że dołączam plik nagłówkowy z innego projektu Windows. Rzeczywiście, na samym dole tego pliku znalazłem dyrektywę:

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

Nie trzeba dodawać, że usunięcie tej linii rozwiązało mój problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.