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@16
odwołuje się funkcja___tmainCRTStartup
Co powinienem zrobić?
c++
visual-studio
visual-c++
NAIEM
źródło
źródło
Odpowiedzi:
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ł
źródło
tWinMain
jako głównej funkcji, musisz dołączyć tchar.h lub zmienić go na jednąWinMain
lub wwWinMain
zależ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)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ń :W ten sposób pozbędziesz się okna konsoli.
źródło
Jeśli masz ten problem i używasz Qt - musisz połączyć qtmain.lib lub qtmaind.lib
źródło
$(QTDIR)\lib\qtmaind.lib
do dodatkowych zależności.CONFIG += console
do.pro
pliku rozwiązało problem z moim projektem QtOpró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.
źródło
Uwzględnij,
<tchar.h>
który ma wiersz:źródło
Jeśli używasz zestawu znaków Unicode, ale wpis nie został ustawiony, możesz określić / ENTRY: „wWinMainCRTStartup”
źródło
nie widzę głównej funkcji.
Upewnij się, że ma główną funkcję.
przykład:
mam nadzieję, że działa dobrze. :)
źródło
main
nie rozwiązuje tego problemu.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.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).
źródło
.dll
kompilator jest ustawiony, nadal próbuje zbudować aplikację dla systemu Windows.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!
źródło
Jeśli faktycznie chcesz użyć _tWinMain () zamiast main (), upewnij się, że masz odpowiednią konfigurację dla twojego projektu
W pliku c / cpp, w którym zdefiniowano _tWinMain () , dodaj:
#include <Windows.h>
#include <tchar.h>
źródło
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,
main
funkcja, 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ć/c
tylko 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)._WinMain
to nazwa firmy Microsoftmain
podczas łączenia.Ponadto: jeszcze nie uruchamiasz kodu, kompilujesz go (i łączysz). C ++ nie jest językiem interpretowanym.
źródło
WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
punktu wejścia. Ten błąd konsolidatora wskazuje, że projekt jest budowany dla podsystemu Windows, a nie podsystemu konsoli._WinMain@16
to 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 tworzeniamain
linków” . Jeśli celujesz w podsystem konsoli, CRT dostarczany z programem Visual Studio wywoła punkt wejścia o nazwiemain
. Jeśli jest niezdefiniowany, konsolidator będzie narzekał na brakujący symbol o nazwie_main
.Jeśli używasz CMake, możesz również otrzymać ten błąd podczas ustawiania
SET(GUI_TYPE WIN32)
w aplikacji konsoli.źródło
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ę:
Nie trzeba dodawać, że usunięcie tej linii rozwiązało mój problem.
źródło