lỗi LNK2019: ký hiệu bên ngoài chưa được giải quyết _WinMain @ 16 được tham chiếu trong hàm ___tmainCRTStartup


143

Trong khi tôi đang chạy mã đơn giản như dưới đây, tôi có hai lỗi như sau:

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

Lỗi:

MSVCRTD.lib (crtexew.obj): lỗi LNK2019: ký hiệu bên ngoài chưa được giải quyết được _WinMain@16tham chiếu trong hàm___tmainCRTStartup

Tôi nên làm gì?


1
Đây có phải là tất cả các mã? Chức năng chính của bạn ở đâu?
Connman

2
Cũng có vẻ như loại dự án được đặt sai. Lỗi liên kết liên quan đến WinMain ngụ ý bạn đã cố gắng tạo dự án Win32. Nếu bạn chỉ muốn một cái gì đó để xuất văn bản đến dấu nhắc lệnh, hãy thử thay đổi loại dự án thành Bảng điều khiển.
Kilanash

4
Nhân tiện, nếu bạn gặp lỗi trình biên dịch / trình liên kết, bạn không "chạy" mã.
André Caron

1
Tôi đã thử thay đổi loại dự án, nhưng project = exe hoạt động thay vì console.
Dom

Câu trả lời:


352

Đó là một vấn đề liên kết.

Cố gắng thay đổi Thuộc tính -> Trình liên kết -> Hệ thống -> Hệ thống con (trong Visual Studio).

từ Windows (/ SUBSYSTEM: WINDOWS) đến Console (/ SUBSYSTEM: TIÊU THỤ)

Cái này giúp tôi


3
Tôi đã có cùng một vấn đề. Câu trả lời của bạn không có ích. Bất kỳ đề nghị khác?
Parth Sane

1
Tôi gặp vấn đề đó khi sử dụng MS Visual Studio. Nếu môi trường của bạn khác đi, bạn có thể phải sửa nó khác đi. Nhưng nó vẫn phải là một vấn đề liên kết.
Bohdan

2
Nếu bạn đang sử dụng tWinMainlàm chức năng chính của mình, bạn phải bao gồm tchar.h hoặc thay đổi nó thành một trong hai WinMainhoặc wWinMaintùy thuộc vào việc ứng dụng của bạn có phải là Unicode hay không. Không làm như vậy cũng dẫn đến lỗi liên kết này ngay cả với hệ thống con chính xác. (/ SUBSYSTEM: WINDOWS)
lisa

Điều này giúp tôi, ngoài việc tôi còn phải vô hiệu hóa phần mềm chống vi-rút Avast .
XCS

1
Điều này chỉ hoạt động sau khi tôi chọn "tất cả các cấu hình" cho cả nền tảng và loại. Chọn "xây dựng" trên "Giải pháp" đã cố gắng xây dựng tất cả và cái đầu tiên đã thử KHÔNG phải là cái đã được chỉ định cho hệ thống con giao diện điều khiển.
Joseph Stateson

83

Như những người khác đã đề cập, bạn có thể thay đổi Hệ thống con thành Bảng điều khiển và lỗi sẽ biến mất.

Hoặc nếu bạn muốn giữ hệ thống con Windows, bạn chỉ có thể gợi ý điểm nhập cảnh của bạn là gì, vì bạn chưa xác định ___tmainCRTStartup. Bạn có thể làm điều này bằng cách thêm các mục sau vào Thuộc tính -> Trình liên kết -> Dòng lệnh :

/ NHẬP: "mainCRTStartup"

Bằng cách này bạn thoát khỏi cửa sổ giao diện điều khiển.


3
+1: "Bằng cách này bạn thoát khỏi cửa sổ giao diện điều khiển." - Mát mẻ! Đã học sth. ngay moi!
Valentin Heinitz

1
+1 cho lời khuyên, tôi đã cố gắng tìm ra điều này trong khoảng 20 phút, vì với SFML tôi chỉ có thể chỉ định hệ thống phụ Windows, với GLFW rõ ràng không khác nhau cảm ơn (=
daniel

14

Nếu bạn đang gặp vấn đề này và đang sử dụng Qt - bạn cần liên kết qtmain.lib hoặc qtmaind.lib


Đó là trên Project -> Properties -> Linker -> Input. Thêm $(QTDIR)\lib\qtmaind.libvào phụ thuộc bổ sung.
mathiasfk

1
Thêm CONFIG += consolevào .protệp đã khắc phục sự cố cho dự án Qt của tôi
Synck

12

Bên cạnh việc thay đổi nó thành Console (/SUBSYSTEM:CONSOLE)như những người khác đã nói, bạn có thể cần thay đổi điểm vào trong Thuộc tính -> Trình liên kết -> Nâng cao -> Điểm vào. Đặt nó vào mainCRTStartup .

Có vẻ như Visual Studio có thể đang tìm kiếm chức năng WinMain thay vì chính, nếu bạn không chỉ định khác.


10

Bao gồm <tchar.h>có dòng:

#define _tWinMain wWinMain

7

Nếu bạn sử dụng Bộ ký tự Unicode, nhưng mục nhập chưa được đặt, bạn có thể chỉ định / ENTRY: "wWinMainCRTStartup"


cứu người cho tôi! Tôi đã sử dụng cmake + mfc (unicode)
malat

4

Tôi không thấy chức năng chính.

hãy chắc chắn rằng nó có chức năng chính.

thí dụ :

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

}

Hy vọng rằng nó hoạt động tốt. :)


Điều này không có ích. Trình liên kết đang phàn nàn về một điểm nhập WinMain không xác định . Xác định một điểm vào được gọi là mainkhông có gì để giải quyết điều đó.
IInspectable

Trình liên kết cố gắng giải quyết các phiên bản main/ WinMainphiên bản khác nhau và nếu không tìm thấy phiên bản nào trong số đó thì không tìm thấy WinMain @ 16 , nhưng thông báo này không chính xác.
Lorinczy Zsigmond

3

Nếu dự án của bạn là DLL, thì trường hợp đó có thể là trình liên kết đó muốn xây dựng một chương trình điều khiển. Mở thuộc tính dự án. Chọn cài đặt Chung. Chọn loại cấu hình Thư viện động ở đó (.


Tôi có chính xác vấn đề đó nhưng mặc dù .dlltrình biên dịch được thiết lập vẫn đang cố gắng xây dựng ứng dụng windows.
Tomáš Zato - Tái lập Monica

3

Tôi không chắc chắn nơi để gửi câu trả lời này của tôi nhưng tôi nghĩ rằng đó là nơi thích hợp. Tôi đã gặp phải lỗi này ngày hôm nay và việc chuyển đổi các hệ thống con không thay đổi điều gì.

Thay đổi các tập tin lib 64 bit thành 32 bit (x86) đã giúp tôi rất nhiều, tôi hy vọng nó sẽ giúp được ai đó ngoài kia!


Tôi đã thử điều này và làm việc, mặc dù việc biên dịch lại các phụ thuộc cho cùng các mục tiêu cũng hoạt động.
Jamie Nicholl-Shelley

cũng làm việc cho tôi ... có vẻ như trình hướng dẫn kiểm tra đơn vị sử dụng điểm vào 32 bit
Erik Aronesty

3

Nếu bạn thực sự muốn sử dụng _tWinMain () thay vì main (), hãy đảm bảo cấu hình liên quan đến dự án của bạn có

  1. Trình liên kết-> Hệ thống -> Hệ thống con => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Bộ tiền xử lý -> Định nghĩa bộ tiền xử lý => Thay thế _CONSOLE bằng _WINDOWS
  3. Trong tệp c / cpp nơi _tWinMain () được xác định, hãy thêm:

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


2

Bạn đã cố gắng biến tệp nguồn đó thành tệp thực thi, điều này rõ ràng là không thể, bởi vì điểm nhập bắt buộc, mainhàm, không được xác định. Thêm một tệp main.cpp và xác định một chức năng chính. Nếu bạn đang làm việc trên dòng lệnh (mà tôi nghi ngờ), bạn có thể thêm /cvào chỉ biên dịch và không liên kết. Điều này sẽ chỉ tạo ra một tệp đối tượng, cần phải được liên kết thành một lib hoặc chia sẻ tĩnh hoặc một ứng dụng (trong trường hợp đó bạn sẽ cần một tệp từ chối với định nghĩa chính).

_WinMainlà tên của Microsoft mainkhi liên kết.

Ngoài ra: bạn chưa chạy mã, bạn đang biên dịch (và liên kết) nó. C ++ không phải là một ngôn ngữ được giải thích.


5
Trên thực tế, anh ta cần một WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)điểm vào. Lỗi liên kết này chỉ ra rằng dự án đang được xây dựng cho hệ thống con Windows, không phải hệ thống con giao diện điều khiển.
Adam Maras

@Adam: ah vâng, tôi đã bị Qt làm hỏng :) (điều này che giấu WinMain khỏi bạn một cách hiệu quả).
rubenvb

WinMain chỉ dành cho các ứng dụng Windows. Các ứng dụng bảng điều khiển sử dụng một tên khác _tmain, phân giải thành chính hoặc wmain tùy thuộc vào cài đặt Unicode / MBCS.
Steve Townsend

@AdamMara, hoàn hảo. Tôi đang tìm kiếm chữ viết hoa và nguyên mẫu cần thiết. Nó hoạt động hoàn hảo bây giờ. Cảm ơn!
Synetech

_WinMain@16là biểu tượng được trang trí của điểm nhập do người dùng cung cấp được gọi bởi mã khởi động trong CRT, khi nhắm mục tiêu hệ thống con Windows. Đó không phải là "tên của Microsoft mainkhi liên kết" . Nếu bạn nhắm mục tiêu hệ thống con giao diện điều khiển, CRT đi kèm với Visual Studio sẽ gọi một điểm nhập có tên main. Nếu không xác định, trình liên kết sẽ phàn nàn về một biểu tượng bị thiếu được gọi là _main.
IInspectable

1

Nếu bạn đang sử dụng CMake, bạn cũng có thể gặp lỗi này khi đặt SET(GUI_TYPE WIN32)trên ứng dụng bảng điều khiển.


1

Các đề xuất uyên bác được đề cập ở trên sẽ giải quyết vấn đề trong 99,99% các trường hợp. Đó là may mắn của tôi mà họ đã không làm. Trong trường hợp của tôi, hóa ra tôi đã bao gồm một tệp tiêu đề từ một dự án Windows khác. Chắc chắn, ở dưới cùng của tập tin đó tôi đã tìm thấy chỉ thị:

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

Không cần phải nói, loại bỏ dòng này đã giải quyết vấn đề của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.