त्रुटि LNK2019: अनसुलझे बाहरी प्रतीक _WainMain @ 16 फ़ंक्शन में संदर्भित ___tmainCRTStartup


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
क्या यह सब कोड है? आपका मुख्य कार्य कहां है?
कॉनमैन

2
यह भी दिखता है कि प्रोजेक्ट का प्रकार गलत है। WinMain के बारे में लिंकर त्रुटि का अर्थ है कि आपने Win32 प्रोजेक्ट बनाने का प्रयास किया है। यदि आप कमांड प्रॉम्प्ट पर टेक्स्ट को आउटपुट करना चाहते हैं, तो प्रोजेक्ट प्रकार को कंसोल में बदलने का प्रयास करें।
किलानाश

4
वैसे, यदि आपको कंपाइलर / लिंकर त्रुटियां हो रही हैं, तो आप कोड को "रन" नहीं कर रहे हैं।
एंड्रे कैरन

1
मैंने प्रोजेक्ट प्रकार बदलने की कोशिश की, लेकिन प्रोजेक्ट = exe ने कंसोल के बजाय काम किया।
डोम

जवाबों:


352

एक लिंक समस्या है।

गुण बदलने की कोशिश करें -> लिंकर -> सिस्टम -> सबसिस्टम (विज़ुअल स्टूडियो में)।

से विंडोज (/ सबसिस्टम: Windows) के लिए कंसोल (/ सबसिस्टम: कंसोल)

इसने मेरी मदद की


3
मुझे एक ही मुद्दा मिला है। आपका जवाब मदद नहीं कर रहा है। कोई अन्य सुझाव?
पार्थ सेन

1
MS Visual Studio का उपयोग करते समय मुझे वह समस्या थी। यदि आपका वातावरण अलग है, तो आपको इसे अलग तरीके से ठीक करना पड़ सकता है। लेकिन यह अभी भी एक लिंकर समस्या होना चाहिए।
बोहदन

2
यदि आप tWinMainअपने मुख्य कार्य के रूप में उपयोग कर रहे हैं , तो आपको tchar.h को शामिल करना होगा या इसे WinMainया तो या wWinMainइस पर निर्भर करना होगा कि आपका ऐप यूनीकोड ​​है या नहीं। ऐसा करने में विफलता सही सबसिस्टम के साथ भी इस लिंकर त्रुटि को जन्म देती है। ((SUBSYSTEM: WINDOWS)
लीजा

इससे मुझे मदद मिली, इसके अलावा मुझे अवास्ट एंटी-वायरस को भी निष्क्रिय करना पड़ा ।
एक्ससीएस

1
प्लेटफॉर्म और प्रकार दोनों के लिए "सभी कॉन्फ़िगरेशन" चयनित करने के बाद ही मैंने यह काम किया। "समाधान" पर "बिल्ड" का चयन करने के लिए सभी का निर्माण करने का प्रयास किया गया और पहले प्रयास किया गया कोई भी कंसोल सबसिस्टम के लिए निर्दिष्ट नहीं था।
जोसेफ स्टेट्सन

83

जैसा कि दूसरों ने उल्लेख किया है कि आप सबसिस्टम को कंसोल में बदल सकते हैं और त्रुटि दूर हो जाएगी।

या यदि आप विंडोज सबसिस्टम रखना चाहते हैं तो आप केवल इस बात पर इशारा कर सकते हैं कि आपका प्रवेश बिंदु क्या है, क्योंकि आपने परिभाषित नहीं किया है ___tmainCRTStartup। आप इसे निम्नलिखित गुणों में जोड़कर कर सकते हैं -> लिंकर -> कमांड लाइन :

/ प्रवेश: "mainCRTStartup"

इस तरह आपको कंसोल विंडो से छुटकारा मिलता है।


3
+1: "इस तरह आपको कंसोल विंडो से छुटकारा मिलता है।" - ठंडा! Sth सीखा। नई आज वी!
वैलेंटाइन हेनिट्ज

1
सलाह के लिए +1, मैं 20 मिनट के लिए यह पता लगाने की कोशिश कर रहा था, क्योंकि एसएफएमएल के साथ मैं उप प्रणाली विंडोज को निर्दिष्ट कर सकता हूं, GLFW के साथ जो स्पष्ट रूप से इतना अलग नहीं है (=
daniel

14

यदि आपको यह समस्या आ रही है और Qt का उपयोग कर रहे हैं - तो आपको qtmain.lib या qtmaind.lib लिंक करना होगा


यह परियोजना पर है -> गुण -> लिंकर -> इनपुट। $(QTDIR)\lib\qtmaind.libअतिरिक्त निर्भरता में जोड़ें ।
mathiasfk

1
जोड़ने CONFIG += consoleके लिए .proफ़ाइल मेरी क्यूटी परियोजना के लिए समस्या का समाधान हो
Synck

12

Console (/SUBSYSTEM:CONSOLE)अन्य लोगों ने जैसा कहा है, उसे बदलने के अलावा , आपको गुण -> लिंकर -> उन्नत -> प्रवेश बिंदु में प्रवेश बिंदु को बदलने की आवश्यकता हो सकती है । इसे mainCRTStartup पर सेट करें ।

ऐसा लगता है कि विजुअल स्टूडियो मुख्य के बजाय WinMain फ़ंक्शन की खोज कर रहा है, यदि आप अन्यथा निर्दिष्ट नहीं करते हैं।



7

यदि आप यूनिकोड कैरेक्टर सेट का उपयोग करते हैं, लेकिन प्रविष्टि सेट नहीं की गई है, तो आप निर्दिष्ट कर सकते हैं / ENTRY: "wWinMainCRTStartup"


मेरे लिए जीवन रक्षक! मैं cmake + MFC (यूनिकोड) का उपयोग किया गया था
malat

4

मैं मुख्य कार्य नहीं देख रहा हूँ।

कृपया सुनिश्चित करें कि इसका मुख्य कार्य है।

उदाहरण :

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

}

आशा है कि यह अच्छी तरह से काम करता है। :)


यह मदद नहीं करता है। लिंकर एक अपरिभाषित WinMain प्रविष्टि बिंदु के बारे में शिकायत कर रहा है । एक प्रविष्टि बिंदु को परिभाषित mainकरने से इसे हल करने के लिए कुछ भी नहीं होता है।
IInspectable

लिंकर अलग main/ WinMainसंस्करणों को हल करने की कोशिश करता है , और यदि उनमें से कोई भी नहीं मिला है , तो यह कहता है कि WinMain @ 16 नहीं मिला , लेकिन यह संदेश बिल्कुल सही है।
लोरिनज़ी ज़िग्डमंड

3

यदि आपका प्रोजेक्ट Dll है, तो मामला यह हो सकता है कि लिंकर कंसोल प्रोग्राम बनाना चाहता है। प्रोजेक्ट गुण खोलें। सामान्य सेटिंग्स का चयन करें। वहां (.dll) कॉन्फ़िगरेशन प्रकार का चयन करें।


मुझे वास्तव में यह समस्या है, लेकिन हालांकि .dllसेट कंपाइलर अभी भी विंडोज़ ऐप बनाने की कोशिश कर रहा है।
टॉम ज़ातो -

3

मुझे यकीन नहीं है कि मेरा यह उत्तर कहां है लेकिन मुझे लगता है कि यह सही जगह है। मुझे आज बहुत त्रुटि आई और सबसिस्टम को स्विच करने से कोई चीज़ नहीं बदली।

32 बिट (x86) के लिए 64 बिट के लिए आवश्यक फ़ाइल को बदलने से मेरे लिए चाल चली गई, मुझे आशा है कि यह किसी को वहाँ से बाहर निकालने में मदद करेगा!


मैंने यह कोशिश की और काम किया, हालांकि एक ही लक्ष्य के लिए निर्भरता की एक recompile भी काम करता है।
जेमी निकोल-शेली

मेरे लिए भी काम किया ... ऐसा लगता है जैसे यूनिट टेस्ट विज़ार्ड एक 32 बिट प्रविष्टि बिंदु का उपयोग करता है
एरिक एरोनिटी

3

यदि आप वास्तव में मुख्य के बजाय _tWinMain () का उपयोग करना चाहते हैं ( तो सुनिश्चित करें कि आपके प्रोजेक्ट में प्रासंगिक कॉन्फ़िगरेशन है

  1. लिंकर-> सिस्टम -> सबसिस्टम => विंडोज (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> प्रीप्रोसेसर -> प्रीप्रोसेसर परिभाषाएँ => _CONSOLE को _INDINDS के साथ बदलें
  3. C / cpp फ़ाइल में जहाँ _tWinMain () परिभाषित है, जोड़ें:

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


2

आपके द्वारा उस स्रोत फ़ाइल को एक निष्पादन योग्य में बदलने की कोशिश की गई, जो स्पष्ट रूप से संभव नहीं है, क्योंकि अनिवार्य प्रवेश बिंदु, mainफ़ंक्शन, परिभाषित नहीं है। एक फ़ाइल main.cpp जोड़ें और एक मुख्य फ़ंक्शन को परिभाषित करें। यदि आप कमांडलाइन पर काम कर रहे हैं (जो मुझे संदेह है), तो आप /cकेवल संकलन और लिंक नहीं जोड़ सकते हैं । यह केवल एक ऑब्जेक्ट फ़ाइल का उत्पादन करेगा, जिसे या तो स्थिर या साझा किए गए काम या एप्लिकेशन में जोड़ा जाना चाहिए (जिस मामले में आपको मुख्य परिभाषित के साथ एक ओज फ़ाइल की आवश्यकता होगी)।

_WinMainmainलिंक करते समय Microsoft का नाम है ।

इसके अलावा: आप अभी तक कोड नहीं चला रहे हैं, आप इसे संकलित कर रहे हैं (और लिंक कर रहे हैं )। C ++ एक व्याख्या की गई भाषा नहीं है।


5
दरअसल, उसे WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)एंट्री पॉइंट चाहिए। यह लिंकर त्रुटि इंगित करता है कि प्रोजेक्ट विंडोज सबसिस्टम के लिए बनाया जा रहा है, कंसोल सबसिस्टम के लिए नहीं।
एडम मारस

@ अदम: आह हां, मैं Qt :) द्वारा खराब कर दिया गया हूं (जो प्रभावी रूप से आपसे WinMain छुपाता है)।
रुबनेव

WinMain केवल Windows अनुप्रयोगों के लिए है। कंसोल ऐप एक अलग नाम _tmain का उपयोग करते हैं, जो यूनिकोड / एमबीसीएस सेटिंग के आधार पर मुख्य या wmain को हल करता है।
स्टीव टाउनसेंड

@ अदमरास, एकदम सही। मैं अपेक्षित पूंजीकरण और प्रोटोटाइप की तलाश में था। यह अब पूरी तरह से काम करता है। धन्यवाद!
19

_WinMain@16विंडोज उप-प्रणाली को लक्षित करते समय CRT में स्टार्टअप कोड द्वारा उपयोगकर्ता द्वारा प्रदान प्रविष्टि बिंदु का सजाया गया प्रतीक है। यह " mainलिंक करते समय Microsoft का नाम नहीं है " । यदि आप कंसोल सबसिस्टम को लक्षित करते हैं, तो CRT जो विज़ुअल स्टूडियो के साथ जहाज एक एंट्री पॉइंट कहलाता है main। यदि अपरिभाषित है, तो लिंक करने वाला एक लापता प्रतीक के बारे में शिकायत करेगा _main
IInspectable

1

यदि आप CMake का उपयोग कर रहे हैं, तो आप SET(GUI_TYPE WIN32)कंसोल अनुप्रयोग पर सेट करते समय भी यह त्रुटि प्राप्त कर सकते हैं ।


1

ऊपर उल्लिखित एट्रूडाइट सुझाव 99.99% मामलों में समस्या को हल करेगा। यह मेरी किस्मत थी कि उन्होंने नहीं किया। मेरे मामले में यह पता चला कि मैं एक अलग विंडोज प्रोजेक्ट से हेडर फाइल शामिल कर रहा था। यकीन है कि पर्याप्त, उस फ़ाइल के तल पर मुझे निर्देश मिला:

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

कहने की जरूरत नहीं कि इस लाइन को हटाने से मेरी समस्या हल हो गई।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.