ข้อผิดพลาด LNK2019: สัญลักษณ์ภายนอกที่ไม่ได้รับการแก้ไข _WinMain @ 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
นี่คือรหัสทั้งหมดหรือไม่ หน้าที่หลักของคุณอยู่ที่ไหน
Connman

2
ดูเหมือนว่าประเภทของโครงการจะตั้งค่าผิด ข้อผิดพลาด linker เกี่ยวกับ WinMain หมายถึงคุณพยายามสร้างโครงการ Win32 หากคุณต้องการให้บางสิ่งบางอย่างเพื่อส่งข้อความไปยังพรอมต์คำสั่งลองเปลี่ยนประเภทโครงการเป็นคอนโซล
Kilanash

4
อย่างไรก็ตามถ้าคุณได้รับข้อผิดพลาดของคอมไพเลอร์ / ลิงเกอร์คุณจะไม่ "รัน" รหัส
André Caron

1
ฉันพยายามเปลี่ยนประเภทโครงการ แต่ project = exe ทำงานแทนคอนโซล
Dom

คำตอบ:


352

นั่นเป็นปัญหาตัวเชื่อมโยง

ลองเปลี่ยน Properties -> Linker -> System -> SubSystem (ใน Visual Studio)

จากWindows (/ ระบบย่อย: WINDOWS)ถึงConsole (/ ระบบย่อย: CONSOLE)

อันนี้ช่วยฉันได้


3
ฉันมีปัญหาเดียวกัน คำตอบของคุณไม่ช่วย ข้อเสนอแนะอื่น ๆ ?
Parth Sane

1
ฉันมีปัญหานั้นเมื่อใช้ MS Visual Studio หากสภาพแวดล้อมของคุณแตกต่างจากที่คุณอาจต้องแก้ไขมันแตกต่างกัน แต่มันก็ควรจะเป็นปัญหาลิงเกอร์
Bohdan

2
หากคุณใช้tWinMainเป็นฟังก์ชั่นหลักของคุณคุณต้องรวม tchar.h หรือเปลี่ยนเป็นอย่างใดอย่างหนึ่งWinMainหรือwWinMainขึ้นอยู่กับว่าแอพของคุณเป็น Unicode หรือไม่ ความล้มเหลวในการทำเช่นนั้นยังให้ข้อผิดพลาด linker นี้แม้กับระบบย่อยที่ถูกต้อง (/ ระบบย่อย: WINDOWS)
lisa

สิ่งนี้ช่วยฉันได้นอกจากนั้นฉันยังต้องปิดการใช้งานโปรแกรมป้องกันไวรัสAvast
XCS

1
สิ่งนี้ใช้ได้เฉพาะหลังจากที่ฉันเลือก "การกำหนดค่าทั้งหมด" สำหรับทั้งแพลตฟอร์มและประเภท การเลือก "build" บน "Solution" ที่พยายามสร้างทั้งหมดและอันแรกที่ลองไม่ใช่ที่ระบุไว้สำหรับระบบย่อยคอนโซล
โจเซฟฯ ระหว่าง

83

ตามที่คนอื่น ๆ กล่าวถึงคุณสามารถเปลี่ยนระบบย่อยเป็นคอนโซลและข้อผิดพลาดจะหายไป

หรือถ้าคุณต้องการที่จะให้ระบบย่อยของ Windows ___tmainCRTStartupที่คุณก็สามารถแบะท่าสิ่งที่จุดเริ่มต้นของคุณเพราะคุณยังไม่ได้กำหนด คุณสามารถทำได้โดยเพิ่มสิ่งต่อไปนี้ในProperties -> Linker -> บรรทัดคำสั่ง :

/ ENTRY: "mainCRTStartup"

วิธีที่คุณกำจัดหน้าต่างคอนโซลนี้


3
+1: "วิธีนี้คุณจะกำจัดหน้าต่างคอนโซล" - เจ๋ง! เรียนรู้ sth ใหม่วันนี้!
Valentin Heinitz

1
+1 สำหรับคำแนะนำฉันพยายามคิดออกเช่นนี้เป็นเวลา 20 นาทีเนื่องจากด้วย SFML ฉันสามารถระบุระบบย่อย Windows ด้วย GLFW ที่เห็นได้ชัดว่าไม่แตกต่างกันมากขอบคุณ (=
แด

14

หากคุณมีปัญหานี้และกำลังใช้ Qt - คุณต้องเชื่อมโยง qtmain.lib หรือ qtmaind.lib


ที่อยู่ในโครงการ -> คุณสมบัติ -> ตัวเชื่อมโยง -> อินพุต เพิ่ม$(QTDIR)\lib\qtmaind.libไปยังการพึ่งพาเพิ่มเติม
mathiasfk

1
เพิ่มCONFIG += consoleไปยัง.proไฟล์แก้ไขปัญหาสำหรับโครงการ Qt ของฉัน
Synck

12

นอกเหนือจากการเปลี่ยนConsole (/SUBSYSTEM:CONSOLE)เป็นอย่างที่คนอื่นพูดคุณอาจต้องเปลี่ยนจุดเริ่มต้นในคุณสมบัติ -> ตัวเชื่อมโยง -> ขั้นสูง -> จุดเข้าใช้งาน ตั้งเป็นmainCRTS เริ่มต้น

ดูเหมือนว่า Visual Studio อาจค้นหาฟังก์ชัน WinMain แทน main หากคุณไม่ได้ระบุเป็นอย่างอื่น



7

หากคุณใช้ชุดอักขระ Unicode แต่ไม่ได้ตั้งค่ารายการคุณสามารถระบุ / เข้า: "wWinMainCRTStartup"


ช่วยชีวิตฉัน! ฉันใช้ cmake + mfc (ยูนิโค้ด)
malat

4

ฉันไม่เห็นฟังก์ชั่นหลัก

โปรดตรวจสอบให้แน่ใจว่ามันมีฟังก์ชั่นหลัก

ตัวอย่าง:

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

}

หวังว่ามันจะทำงานได้ดี :)


มันไม่ได้ช่วยอะไร ตัวเชื่อมโยงบ่นเกี่ยวกับจุดเข้าใช้งานWinMain ที่ไม่ได้กำหนด การกำหนดจุดเริ่มต้นที่เรียกว่าmainไม่ทำอะไรเลย
IIsspectable

ตัวเชื่อมโยงพยายามแก้ไขmain/ WinMainรุ่นที่แตกต่างกันและหากไม่พบพวกมันมันบอกว่าไม่พบ WinMain @ 16แต่ข้อความนี้ไม่ถูกต้อง
Lorinczy Zsigmond

3

หากโครงการของคุณเป็น Dll เคสอาจเป็นตัวลิงก์นั้นต้องการสร้างโปรแกรมคอนโซล เปิดคุณสมบัติของโครงการ เลือกการตั้งค่าทั่วไป เลือกประเภทการกำหนดค่า Dynamic Library นั่น (.dll)


ฉันมีปัญหาตรงนั้น แต่แม้ว่า.dllคอมไพเลอร์ชุดนี้ยังคงพยายามสร้างแอพ windows
Tomáš Zato - Reinstate Monica

3

ฉันไม่แน่ใจว่าจะโพสต์คำตอบของฉันได้ที่ไหน แต่ฉันคิดว่ามันเป็นสถานที่ที่เหมาะสม ฉันเจอข้อผิดพลาดมากในวันนี้และการเปลี่ยนระบบย่อยไม่ได้เปลี่ยนแปลงอะไรเลย

การเปลี่ยนไฟล์ lib 64 บิตเป็น 32 บิต (x86) ทำเคล็ดลับสำหรับฉันฉันหวังว่ามันจะช่วยให้ใครบางคนอยู่ที่นั่น!


ฉันลองและใช้งานได้แม้ว่าการคอมไพล์ซ้ำของการอ้างอิงไปยังเป้าหมายเดียวกันก็ใช้งานได้
Jamie Nicholl-Shelley

ยังทำงานสำหรับฉัน ... ดูเหมือนว่าการทดสอบหน่วยการใช้ตัวช่วยสร้างจุดเริ่มต้นที่ 32 บิต
เอริค Aronesty

3

ถ้าคุณต้องการใช้_tWinMain ()แทนmain () จริง ๆ ต้องแน่ใจว่าโครงงานที่เกี่ยวข้องนั้นมี

  1. Linker-> System -> SubSystem => Windows (/ ระบบย่อย: WINDOWS)
  2. C / C ++ -> ตัวประมวลผลล่วงหน้า -> คำจำกัดความของตัวประมวลผลล่วงหน้า => แทนที่ _CONSOLE ด้วย _WINDOWS
  3. ในไฟล์ c / cpp โดยที่_tWinMain ()ถูกกำหนดให้เพิ่ม:

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


2

คุณพยายามที่จะแปลงไฟล์ต้นฉบับนั้นเป็นไฟล์ปฏิบัติการซึ่งไม่สามารถระบุได้อย่างชัดเจนเนื่องจากmainไม่ได้กำหนดจุดเข้าใช้งานที่จำเป็น เพิ่มไฟล์ main.cpp และกำหนดฟังก์ชั่นหลัก หากคุณกำลังทำงานกับ commandline (ซึ่งฉันสงสัย) คุณสามารถเพิ่ม/cเพื่อรวบรวมและไม่เชื่อมโยง สิ่งนี้จะสร้างไฟล์วัตถุเท่านั้นซึ่งจะต้องเชื่อมโยงเข้ากับ lib แบบคงที่หรือที่ใช้ร่วมกันหรือแอปพลิเคชัน (ในกรณีนี้คุณจะต้องมีไฟล์ oject ที่มีการกำหนดหลัก)

_WinMainเป็นชื่อของ Microsoft mainเมื่อเชื่อมโยง

นอกจากนี้: คุณยังไม่ได้ใช้รหัสคุณกำลังรวบรวม (และเชื่อมโยง) รหัส C ++ ไม่ใช่ภาษาที่ตีความ


5
ที่จริงแล้วเขาต้องการWinMain(HINSTANCE, HINSTANCE, LPSTR, INT)จุดเข้า ข้อผิดพลาดตัวเชื่อมโยงนี้บ่งชี้ว่าโครงการกำลังถูกสร้างขึ้นสำหรับระบบย่อย Windows ไม่ใช่ระบบย่อยคอนโซล
Adam Maras

@ อดัม: อ่าใช่ฉันถูกปล้นโดย Qt :) (ซึ่งซ่อน WinMain จากคุณได้อย่างมีประสิทธิภาพ)
rubenvb

WinMain สำหรับแอปพลิเคชัน Windows เท่านั้น แอปคอนโซลใช้ชื่อ _tmain ที่แตกต่างกันซึ่งจะเปลี่ยนเป็น main หรือ wmain ขึ้นอยู่กับการตั้งค่า Unicode / MBCS
Steve Townsend

@ AdamMaras สมบูรณ์แบบ ฉันกำลังมองหาตัวพิมพ์ใหญ่และต้นแบบที่จำเป็น มันทำงานได้อย่างสมบูรณ์แบบในขณะนี้ ขอบคุณ!
Synetech

_WinMain@16เป็นสัญลักษณ์ตกแต่งของจุดเข้าใช้งานที่ผู้ใช้เรียกโดยรหัสเริ่มต้นใน CRT เมื่อกำหนดเป้าหมายระบบย่อยของ Windows มันไม่ได้เป็น"ชื่อของ Microsoft สำหรับmainเมื่อเชื่อมโยง" หากคุณกำหนดเป้าหมายระบบย่อยคอนโซล CRT ที่เรือกับ Visual Studio mainจะเรียกจุดรายการที่ชื่อ _mainหากไม่ได้กำหนดลิงเกอร์จะบ่นเกี่ยวกับสัญลักษณ์ที่ขาดหายไปเรียกว่า
IIsspectable

1

หากคุณกำลังใช้ CMake คุณจะได้รับข้อผิดพลาดนี้เมื่อคุณตั้งค่าSET(GUI_TYPE WIN32)ในแอปพลิเคชันคอนโซล


1

คำแนะนำที่กล่าวถึงข้างต้นจะช่วยแก้ปัญหาได้ 99.99% ของคดีทั้งหมด มันเป็นโชคของฉันที่พวกเขาไม่ได้ ในกรณีของฉันปรากฏว่าฉันรวมไฟล์ส่วนหัวจากโครงการ Windows อื่น ที่ด้านล่างสุดของไฟล์ฉันพบคำสั่ง:

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

ไม่จำเป็นต้องพูดการลบบรรทัดนี้แก้ไขปัญหาของฉันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.