kesalahan LNK2019: simbol eksternal yang belum terselesaikan _WinMain @ 16 direferensikan dalam fungsi ___tmainCRTStartup

143

Sementara saya menjalankan kode sederhana seperti di bawah ini saya memiliki dua kesalahan sebagai berikut:

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

Kesalahan:

MSVCRTD.lib (crtexew.obj): error LNK2019: simbol eksternal yang tidak terselesaikan _WinMain@16dirujuk dalam fungsi___tmainCRTStartup

Apa yang harus saya lakukan?

NAIEM
sumber
1
Apakah ini semua kodenya? Di mana fungsi utama Anda?
Connman
2
Sepertinya juga jenis proyeknya salah. Kesalahan tautan tentang WinMain menyiratkan Anda mencoba membuat proyek Win32. Jika Anda hanya ingin sesuatu menampilkan teks ke prompt perintah, coba ubah jenis proyek menjadi Konsol.
Kilanash
4
Ngomong-ngomong, jika Anda mendapatkan kesalahan compiler / linker, Anda tidak "menjalankan" kode tersebut.
André Caron
1
Saya mencoba mengubah jenis proyek, tetapi project = exe berfungsi sebagai pengganti konsol.
Dom

Jawaban:

352

Itu masalah penghubung.

Cobalah untuk mengubah Properties -> Linker -> System -> SubSystem (dalam Visual Studio).

dari Windows (/ SUBSYSTEM: WINDOWS) ke Console (/ SUBSYSTEM: CONSOLE)

Yang ini membantu saya

Bohdan
sumber
3
Saya punya masalah yang sama. Jawaban Anda tidak membantu. Ada saran lain?
Parth Sane
1
Saya punya masalah ketika menggunakan MS Visual Studio. Jika lingkungan Anda berbeda, Anda mungkin harus memperbaikinya secara berbeda. Tapi itu harus tetap menjadi masalah penghubung.
Bohdan
2
Jika Anda menggunakan tWinMainsebagai fungsi utama, Anda harus memasukkan tchar.h atau mengubahnya ke salah satu WinMainatau wWinMaintergantung pada apakah aplikasi Anda adalah Unicode atau tidak. Kegagalan untuk melakukannya juga menghasilkan kesalahan penghubung ini bahkan dengan subsistem yang benar. (/ SUBSYSTEM: WINDOWS)
lisa
Ini membantu saya, selain itu saya juga harus menonaktifkan Avast anti-virus.
XCS
1
Ini bekerja hanya setelah saya memilih "semua konfigurasi" untuk platform dan tipe. Memilih "build" pada "Solution" berusaha membangun semua dan yang pertama mencoba BUKAN yang telah ditentukan untuk subsistem konsol.
Joseph States
83

Seperti yang disebutkan lainnya, Anda dapat mengubah SubSistem ke Konsol dan kesalahan akan hilang.

Atau jika Anda ingin mempertahankan subsistem Windows, Anda hanya bisa memberi petunjuk pada apa titik masuk Anda, karena Anda belum menentukan ___tmainCRTStartup. Anda dapat melakukan ini dengan menambahkan berikut ini ke Properti -> Linker -> Baris perintah :

/ ENTRY: "mainCRTStartup"

Dengan cara ini Anda menyingkirkan jendela konsol.

Morten Kristensen
sumber
3
+1: "Dengan cara ini Anda menyingkirkan jendela konsol." - Keren! Belajar sth. baru hari ini!
Valentin Heinitz
1
+1 untuk sarannya, saya mencoba mencari tahu ini selama 20 menit, karena dengan SFML saya hanya dapat menentukan sub sistem Windows, Dengan GLFW yang jelas berbeda, terima kasih (=
daniel
14

Jika Anda mengalami masalah ini dan menggunakan Qt - Anda harus menautkan qtmain.lib atau qtmaind.lib

David Casper
sumber
Itu ada di Project -> Properties -> Linker -> Input. Tambahkan $(QTDIR)\lib\qtmaind.libke Dependensi Tambahan.
mathiasfk
1
Menambahkan CONFIG += consoleke .profile memperbaiki masalah untuk proyek Qt saya
Synck
12

Selain mengubahnya menjadi Console (/SUBSYSTEM:CONSOLE)seperti yang dikatakan orang lain, Anda mungkin perlu mengubah titik entri di Properti -> Linker -> Advanced -> Entry Point. Atur ke mainCRTStartup .

Tampaknya Visual Studio mungkin mencari fungsi WinMain alih-alih utama, jika Anda tidak menentukan sebaliknya.

mathiasfk
sumber
10

Sertakan <tchar.h>yang memiliki garis:

#define _tWinMain wWinMain
zaki
sumber
7

Jika Anda menggunakan Set Karakter Unicode, tetapi entri tidak disetel, Anda dapat menentukan / ENTRY: "wWinMainCRTStartup"

Petronius
sumber
penyelamat bagi saya! Saya menggunakan cmake + mfc (unicode)
malat
4

saya tidak melihat fungsi utama.

pastikan itu memiliki fungsi utama.

contoh:

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

}

berharap itu bekerja dengan baik. :)

jefry da gucci
sumber
Ini tidak membantu. Tautan mengeluhkan titik masuk WinMain yang tidak ditentukan . Menentukan titik masuk yang disebut maintidak melakukan apa pun untuk menyelesaikannya.
IInspectable
Linker mencoba menyelesaikan main/ WinMainversi yang berbeda , dan jika tidak ada yang ditemukan dikatakan WinMain @ 16 tidak ditemukan , tetapi pesan ini tidak sepenuhnya benar.
Lorinczy Zsigmond
3

Jika proyek Anda Dll, maka kemungkinan linker ingin membangun program konsol. Buka properti proyek. Pilih pengaturan Umum. Pilih tipe konfigurasi Dynamic Library di sana (.dll).

dunia mimpi
sumber
Saya memiliki masalah itu, tetapi meskipun .dllkompiler yang diset masih mencoba untuk membangun aplikasi windows.
Tomáš Zato - Pasang kembali Monica
3

Saya tidak yakin ke mana harus memposting jawaban saya ini tetapi saya pikir itu adalah tempat yang tepat. Saya menemukan kesalahan ini hari ini dan mengganti subsistem tidak mengubah apa pun.

Mengubah file lib 64bit menjadi 32bit (x86) membantu saya, saya harap ini akan membantu seseorang di luar sana!

Joe yang lain
sumber
Saya mencoba ini dan berhasil, walaupun kompilasi ulang dependensi dengan target yang sama juga berfungsi.
Jamie Nicholl-Shelley
juga bekerja untuk saya ... sepertinya unit test wizard menggunakan titik masuk 32 bit
Erik Aronesty
3

Jika Anda benar-benar ingin menggunakan _tWinMain () alih-alih main () pastikan konfigurasi yang relevan dengan proyek Anda miliki

  1. Linker-> System -> SubSystem => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Preprocessor -> Definisi Preprocessor => Ganti _CONSOLE dengan _WINDOWS
  3. Dalam file c / cpp di mana _tWinMain () didefinisikan, tambahkan:

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

Alex
sumber
2

Anda mencoba mengubah file sumber menjadi file yang dapat dieksekusi, yang jelas tidak mungkin, karena titik masuk wajib, mainfungsinya, tidak ditentukan. Tambahkan file main.cpp dan tentukan fungsi utama. Jika Anda bekerja pada commandline (yang saya ragu), Anda dapat menambahkan /chanya kompilasi dan bukan tautan. Ini akan menghasilkan file objek saja, yang perlu ditautkan ke statis atau shared lib atau aplikasi (dalam hal ini Anda akan memerlukan file oject dengan didefinisikan utama).

_WinMainadalah nama Microsoft untuk mainsaat menautkan.

Juga: Anda belum menjalankan kode, Anda sedang mengkompilasi (dan menautkannya). C ++ bukan bahasa yang ditafsirkan.

rubenvb
sumber
5
Sebenarnya, dia membutuhkan WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)titik masuk. Kesalahan tautan ini menunjukkan bahwa proyek sedang dibangun untuk subsistem Windows, bukan subsistem konsol.
Adam Maras
@ Adam: ah ya, saya dimanjakan oleh Qt :) (yang secara efektif menyembunyikan WinMain dari Anda).
rubenvb
WinMain hanya untuk aplikasi Windows. Aplikasi konsol menggunakan nama _tmain yang berbeda, yang diselesaikan menjadi main atau tergantung pada pengaturan Unicode / MBCS.
Steve Townsend
@AdamMaras, sempurna. Saya mencari huruf besar yang diperlukan dan prototipe. Sekarang berfungsi dengan baik. Terima kasih!
Synetech
_WinMain@16adalah simbol dihiasi dari titik masuk yang disediakan pengguna yang disebut oleh kode startup di CRT, ketika menargetkan subsistem Windows. Itu bukan "nama Microsoft mainketika menghubungkan" . Jika Anda menargetkan subsistem konsol, CRT yang dikirimkan dengan Visual Studio akan memanggil titik entri bernama main. Jika tidak terdefinisi, linker akan mengeluh tentang simbol yang hilang yang disebut _main.
IInspectable
1

Jika Anda menggunakan CMake, Anda juga bisa mendapatkan kesalahan ini ketika Anda mengatur SET(GUI_TYPE WIN32)aplikasi konsol.

Nicolas Holthaus
sumber
1

Saran ilmiah yang disebutkan di atas akan menyelesaikan masalah di 99,99% dari kasus. Itu adalah keberuntunganku bahwa mereka tidak melakukannya. Dalam kasus saya ternyata saya memasukkan file header dari proyek Windows yang berbeda. Cukup yakin, di bagian paling bawah dari file itu saya menemukan arahan:

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

Tak perlu dikatakan, menghapus baris ini memecahkan masalah saya.

Moshe Rubin
sumber