hata LNK2019: çözülmemiş harici sembol _WinMain @ 16, ___tmainCRTStartup işlevinde başvuruda bulundu


143

Aşağıdaki gibi basit kodu çalıştırırken aşağıdaki gibi iki hata var:

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

Hatalar:

MSVCRTD.lib (crtexew.obj): hata LNK2019: işlevde _WinMain@16başvurulan çözülemeyen harici sembol___tmainCRTStartup

Ne yapmalıyım?


1
Tüm kod bu mu? Ana işleviniz nerede?
Connman

2
Ayrıca proje türü yanlış ayarlanmış gibi görünüyor. WinMain ile ilgili linker hatası, bir Win32 projesi oluşturmaya çalıştığınızı gösterir. Yalnızca komut istemine metin çıktısı almak istiyorsanız, proje türünü Konsol olarak değiştirmeyi deneyin.
Kilanash

4
Bu arada, derleyici / linker hataları alıyorsanız, kodu "çalıştırmıyorsunuz".
André Caron

1
Proje türünü değiştirmeyi denedim, ancak konsol yerine proje = exe çalıştı.
Dom

Yanıtlar:


352

Bu bir bağlayıcı sorunu.

Özellikler -> Bağlayıcı -> Sistem -> Alt Sistemi (Visual Studio'da) değiştirmeyi deneyin.

dan Windows (/ SUBSYSTEM: WINDOWS) için Konsolu (/ SUBSYSTEM: KONSOLU)

Bu bana yardımcı oldu


3
Bende aynı sorun var. Cevabınız yardımcı olmuyor. Başka öneriniz var mı?
Parth Sane

1
MS Visual Studio kullanırken bu sorun vardı. Ortamınız farklıysa, farklı bir şekilde düzeltmeniz gerekebilir. Ama yine de bağlayıcı bir sorun olmalı.
Bohdan

2
Eğer kullanıyorsanız tWinMainana fonksiyonu olarak, sen tchar.h içermelidir veya birine değiştirmek WinMainveya wWinMainuygulama Unicode olup olmadığına bağlı olarak değişir. Bunun yapılmaması, doğru alt sistemde bile bu bağlayıcı hatasını verir. (/ SUBSYSTEM: WINDOWS)
lisa

Bu bana yardımcı oldu, bunun dışında Avast anti-virüsünü de devre dışı bırakmak zorunda kaldım .
XCS

1
Bu yalnızca platform ve tür için "tüm yapılandırmalar" ı seçtikten sonra işe yaradı. "Çözüm" üzerinde "derleme" seçeneği seçilmeye çalışıldı ve ilk denenen konsol alt sistemi için belirtilemedi.
Joseph Stateson

83

Diğerlerinin de belirttiği gibi, Alt Sistemi Konsol olarak değiştirebilirsiniz; hata ortadan kalkar.

Veya Windows alt sistemini korumak istiyorsanız, giriş noktanızın ne olduğuna dair ipucu verebilirsiniz, çünkü tanımlamamışsınızdır ___tmainCRTStartup. Bunu, Özellikler -> Bağlayıcı -> Komut satırına aşağıdakileri ekleyerek yapabilirsiniz :

/ GİRİŞ: "mainCRTStartup"

Bu şekilde konsol penceresinden kurtulursunuz.


3
+1: "Bu şekilde konsol penceresinden kurtulursunuz." - Güzel! Öğrenildi sth. bugün yeni!
Valentin Heinitz

1
Tavsiye için +1, ben böyle 20 dakika boyunca anlamaya çalışıyordum, çünkü SFML ile sadece alt sistemi belirtebiliriz, açıkça fark edilmeyen GLFW ile (=
daniel

14

Bu sorunu yaşıyorsanız ve Qt kullanıyorsanız - qtmain.lib veya qtmaind.lib'ı bağlamanız gerekir


İşte Proje -> Özellikler -> Bağlayıcı -> Giriş. $(QTDIR)\lib\qtmaind.libEk Bağımlılıklara Ekle .
mathiasfk

1
Ekleme CONFIG += consoleiçin .prodosyanın benim Qt proje için konuyu sabit
Synck

12

Console (/SUBSYSTEM:CONSOLE)Diğerlerinin söylediği gibi değiştirmenin yanı sıra , Özellikler -> Bağlayıcı -> Gelişmiş -> Giriş Noktası'ndaki giriş noktasını değiştirmeniz gerekebilir . MainCRTStartup olarak ayarlayın .

Aksi belirtilmedikçe Visual Studio, main yerine WinMain işlevini arıyor olabilir.


10

Şu <tchar.h>satırı içerenleri ekle :

#define _tWinMain wWinMain

7

Unicode Karakter Kümesi kullanıyorsanız ancak giriş ayarlanmadıysa / ENTRY: "wWinMainCRTStartup" belirtebilirsiniz.


benim için hayat kurtarıcı! Cmake + mfc (unicode) kullanıyordum
malat

4

ana işlevi görmüyorum.

lütfen ana işlevi olduğundan emin olun.

misal :

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

}

umarım iyi çalışır. :)


Bu yardımcı olmuyor. Bağlayıcı, tanımlanmamış bir WinMain giriş noktasından şikayet ediyor . Denilen bir giriş noktası tanımlamak mainbunu çözmek için hiçbir şey yapmaz.
IInspectable

Bağlayıcı farklı main/ WinMainsürümleri çözmeye çalışır ve hiçbiri bulunmazsa WinMain @ 16 bulunamadı , ancak bu mesaj tam olarak doğru değil diyor .
Lorinczy Zsigmond

3

Projeniz Dll ise, durum bağlayıcı bir konsol programı oluşturmak istiyor olabilir. Proje özelliklerini açın. Genel ayarları seçin. Orada dinamik Kütüphane yapılandırma türünü (.dll) seçin.


Ben tam olarak bu sorun var ama .dllset derleyici hala windows uygulaması oluşturmaya çalışıyor olsa da .
Tomáš Zato - Monica

3

Bu cevabı nereye göndereceğimi bilmiyorum ama bence doğru yer. Bugün bu hatayla karşılaştım ve alt sistemleri değiştirmek hiçbir şeyi değiştirmedi.

64bit lib dosyalarını 32bit (x86) olarak değiştirmek benim için hile yaptı, umarım orada birine yardım eder!


Bunu denedim ve çalıştım, ancak aynı hedeflere olan bağımlılıkların yeniden derlenmesi de işe yarıyor.
Jamie Nicholl-Shelley

Ayrıca benim için çalıştı ... birim test sihirbazı 32 bit giriş noktası kullanıyor gibi görünüyor
Erik Aronesty

3

Aslında main () yerine _tWinMain () kullanmak istiyorsanız , projenizle ilgili yapılandırmanızın

  1. Bağlayıcı-> Sistem -> Alt Sistem => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Önişlemci -> Önişlemci Tanımları => _CONSOLE yerine _WINDOWS yazın
  3. _TWinMain () öğesinin tanımlandığı c / cpp dosyasına şunu ekleyin:

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


2

Zorunlu giriş noktası olan mainişlev tanımlanmadığı için bu kaynak dosyayı yürütülebilir bir dosyaya dönüştürmeye çalıştınız . Main.cpp dosyası ekleyin ve bir ana işlev tanımlayın. Komut satırı üzerinde çalışıyorsanız (ki şüpheliyim), /cbağlantıya değil yalnızca derlemeye ekleyebilirsiniz . Bu, yalnızca statik veya paylaşılan bir lib veya bir uygulamaya bağlanması gereken bir nesne dosyası üretecektir (bu durumda main tanımlı bir oject dosyasına ihtiyacınız olacaktır).

_WinMainmainbağlantı kurarken Microsoft'un adıdır .

Ayrıca: kodu henüz çalıştırmıyorsunuz, derliyorsunuz (ve bağlıyorsunuz). C ++ yorumlanmış bir dil değildir.


5
Aslında bir WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)giriş noktasına ihtiyacı var . Bu bağlayıcı hatası, projenin konsol alt sistemi için değil, Windows alt sistemi için yapıldığını gösterir.
Adam Maras

@Adam: ah evet, Qt tarafından şımartıldım :) (WinMain'i etkili bir şekilde sizden gizler).
rubenvb

WinMain yalnızca Windows uygulamaları içindir. Konsol uygulamaları, Unicode / MBCS ayarına bağlı olarak ana veya wmain olarak çözülen farklı bir _tmain adı kullanır.
Steve Townsend

@AdamMaras, mükemmel. Gerekli büyük harf kullanımı ve prototipi arıyordum. Şimdi mükemmel çalışıyor. Teşekkürler!
Synetech

_WinMain@16Windows alt sistemini hedeflerken CRT'deki başlangıç ​​kodu tarafından çağrılan, kullanıcı tarafından sağlanan giriş noktasının süslü sembolüdür. O değil "Microsoft'un ismi mainbağlarken" . Konsol alt sistemini hedeflerseniz, Visual Studio ile birlikte gelen CRT adlı bir giriş noktası çağırır main. Tanımsızsa, bağlayıcı denilen eksik bir sembolden şikayet edecektir _main.
18'de

1

CMake kullanıyorsanız SET(GUI_TYPE WIN32), bir konsol uygulamasında ayarladığınızda bu hatayı da alabilirsiniz .


1

Yukarıda belirtilen erudite önerileri, vakaların% 99,99'unda sorunu çözecektir. Onlar benim şansım olmadı. Benim durumumda, farklı bir Windows projesinden bir başlık dosyası eklediğim ortaya çıktı. Tabii ki, bu dosyanın en altında şu yönergeyi buldum:

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

Söylemeye gerek yok, bu satırı kaldırmak sorunumu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.