erro LNK2019: símbolo externo não resolvido _WinMain @ 16 mencionado na função ___tmainCRTStartup


143

Enquanto estou executando o código simples, como abaixo, tenho dois erros, como a seguir:

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

Erros:

MSVCRTD.lib (crtexew.obj): erro LNK2019: símbolo externo não resolvido _WinMain@16mencionado na função___tmainCRTStartup

O que devo fazer?


1
Esse é todo o código? Onde está sua principal função?
Connman

2
Também parece que o tipo de projeto está definido errado. O erro do vinculador em relação ao WinMain implica que você tentou criar um projeto Win32. Se você deseja que algo produza texto no prompt de comando, tente alterar o tipo de projeto para Console.
Kilanash

4
A propósito, se você estiver recebendo erros do compilador / vinculador, não está "executando" o código.
André Caron

1
Tentei alterar o tipo de projeto, mas project = exe funcionou em vez de console.
Dom

Respostas:


352

Isso é um problema do vinculador.

Tente alterar Propriedades -> Vinculador -> Sistema -> Subsistema (no Visual Studio).

do Windows (/ SUBSYSTEM: WINDOWS) para o Console (/ SUBSYSTEM: CONSOLE)

Este me ajudou


3
Eu tenho o mesmo problema. Sua resposta não está ajudando. Alguma outra sugestão?
Parth Sane

1
Eu tive esse problema ao usar o MS Visual Studio. Se o seu ambiente for diferente, talvez você precise corrigi-lo de maneira diferente. Mas ainda deve ser um problema de vinculador.
Bohdan

2
Se você estiver usando tWinMaincomo sua principal função, inclua tchar.h ou altere-o para um WinMainou wWinMaindependendo de seu aplicativo ser ou não Unicode. Falha ao fazer isso também gera esse erro do vinculador, mesmo com o subsistema correto. (/ SUBSISTEMA: WINDOWS)
lisa

Isso me ajudou, além disso, eu também tive que desativar o antivírus Avast .
XCS

1
Isso funcionou somente depois que eu selecionei "todas as configurações" para a plataforma e o tipo. Selecionar "compilar" na "Solução" tentou compilar tudo e o primeiro tentado NÃO foi o especificado para o subsistema do console.
Joseph Stateson

83

Como os outros mencionados, você pode alterar o Subsistema para Console e o erro desaparecerá.

Ou, se você deseja manter o subsistema Windows, basta sugerir qual é o seu ponto de entrada, porque você não definiu ___tmainCRTStartup. Você pode fazer isso adicionando o seguinte a Propriedades -> Vinculador -> Linha de comando :

/ ENTRADA: "mainCRTStartup"

Dessa forma, você se livra da janela do console.


3
+1: "Dessa forma, você se livra da janela do console". - Legal! Sth aprendido. novo hoje!
Valentin Heinitz 13/03/14

1
+1 para o conselho, eu estava tentando descobrir isso por cerca de 20 minutos, já que com SFML eu posso apenas especificar o subsistema Windows, com o GLFW que obviamente não é tão obrigado (=
daniel

14

Se você está tendo esse problema e está usando o Qt - é necessário vincular qtmain.lib ou qtmaind.lib


Isso está em Projeto -> Propriedades -> Vinculador -> Entrada. Adicionar $(QTDIR)\lib\qtmaind.liba dependências adicionais.
Mathiasfk

1
A adição CONFIG += consoleao .proarquivo corrigiu o problema do meu projeto Qt
Synck 24/02

12

Além de alterá-lo para Console (/SUBSYSTEM:CONSOLE)como já foi dito, pode ser necessário alterar o ponto de entrada em Propriedades -> Vinculador -> Avançado -> Ponto de entrada. Defina-o como mainCRTStartup .

Parece que o Visual Studio pode estar procurando a função WinMain em vez de main, se você não especificar o contrário.


10

Inclua <tchar.h>qual tem a linha:

#define _tWinMain wWinMain

7

Se você usar o Conjunto de Caracteres Unicode, mas a entrada não estiver definida, poderá especificar / ENTRY: "wWinMainCRTStartup"


salva-vidas para mim! Eu estava usando cmake + mfc (unicode)
malat 02/02

4

não vejo a função principal.

por favor, verifique se ele tem a função principal.

exemplo:

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

}

espero que funcione bem. :)


Isso não ajuda. O vinculador está reclamando de um ponto de entrada indefinido do WinMain . Definir um ponto de entrada chamado mainnão ajuda a resolver isso.
11nspectable

O vinculador tenta resolver diferentes versões main/ WinMainversões e, se nenhuma delas for encontrada, diz WinMain @ 16 não encontrado , mas esta mensagem não está exatamente correta.
Lorinczy Zsigmond

3

Se o seu projeto for Dll, é possível que o vinculador deseje criar um programa de console. Abra as propriedades do projeto. Selecione as configurações gerais. Selecione o tipo de configuração Biblioteca Dinâmica lá (.dll).


Eu tenho exatamente esse problema, mas embora o .dllcompilador definido ainda esteja tentando criar o aplicativo do Windows.
Tomáš Zato - Restabelece Monica

3

Não sei onde postar esta resposta, mas acho que é o lugar certo. Hoje me deparei com esse mesmo erro e a troca de subsistemas não mudou nada.

Alterar os arquivos lib de 64 bits para 32 bits (x86) fez o truque para mim, espero que ajude alguém por aí!


Eu tentei isso e funcionou, embora uma recompilação de dependências para os mesmos destinos também funcione.
Jamie Nicholl-Shelley

Também trabalhou para mim ... parece que os usos Assistente de teste de unidade de um ponto de entrada de 32 bits
Erik Aronesty

3

Se você realmente deseja usar _tWinMain () em vez de main (), verifique se a configuração relevante do seu projeto possui

  1. Linker-> Sistema -> Subsistema => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Pré-processador -> Definições de pré-processador => Substitua _CONSOLE por _WINDOWS
  3. No arquivo c / cpp em que _tWinMain () está definido, adicione:

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


2

Você tentou transformar esse arquivo de origem em um executável, o que obviamente não é possível, porque o ponto de entrada obrigatório, a mainfunção, não está definido. Adicione um arquivo main.cpp e defina uma função principal. Se você estiver trabalhando na linha de comando (o que duvido), você pode adicionar /capenas à compilação e não ao link. Isso produzirá apenas um arquivo de objeto, que precisa ser vinculado a uma lib estática ou compartilhada ou a um aplicativo (nesse caso, você precisará de um arquivo oject com o principal definido).

_WinMainé o nome da Microsoft para mainquando vincular.

Além disso: você ainda não está executando o código, está compilando (e vinculando). C ++ não é uma linguagem interpretada.


5
Na verdade, ele precisa de um WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)ponto de entrada. Esse erro do vinculador indica que o projeto está sendo criado para o subsistema Windows, não para o subsistema do console.
Adam Maras

@ Adam: ah sim, eu fui mimado pelo Qt :) (que efetivamente esconde o WinMain de você).
11117 rubenvb

O WinMain é apenas para aplicativos do Windows. Os aplicativos de console usam um nome diferente _tmain, que resolve como principal ou principal, dependendo da configuração Unicode / MBCS.
9788 Steve Jobs Townsend #

@AdamMaras, perfeito. Eu estava procurando a capitalização e o protótipo necessários. Funciona perfeitamente agora. Obrigado!
Synetech

_WinMain@16é o símbolo decorado do ponto de entrada fornecido pelo usuário chamado pelo código de inicialização no CRT, ao direcionar para o subsistema Windows. Não é "o nome da Microsoft para mainquando vincular" . Se você direcionar o subsistema do console, o CRT fornecido com o Visual Studio chamará um ponto de entrada chamado main. Se indefinido, o vinculador reclamará de um símbolo ausente chamado _main.
11nspectable

1

Se você estiver usando o CMake, também poderá receber esse erro ao definir SET(GUI_TYPE WIN32)um aplicativo de console.


1

As sugestões eruditas mencionadas acima resolverão o problema em 99,99% dos casos. Foi a minha sorte que eles não fizeram. No meu caso, eu estava incluindo um arquivo de cabeçalho de um projeto diferente do Windows. Com certeza, na parte inferior desse arquivo, encontrei a diretiva:

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

Escusado será dizer que remover essa linha resolveu meu problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.