web-dev-qa-db-ja.com

エラーLNK2019:未解決の外部シンボル_WinMain @ 16は関数___tmainCRTStartupで参照されています

私は以下のような簡単なコードを実行していますが、次の2つのエラーがあります。

#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

私は何をすべきか?

133
NAIEM

これはリンカーの問題です。

[プロパティ]-> [リンカー]-> [システム]-> [サブシステム](Visual Studio)を変更してみてください。

fromWindows(/ SUBSYSTEM:WINDOWS)toConsole(/ SUBSYSTEM:CONSOLE)

これが私を助けてくれました

338
Bohdan

他の人が述べたように、サブシステムをコンソールに変更するとエラーは消えます。

または、Windowsサブシステムを保持したい場合は、___tmainCRTStartupを定義していないため、エントリポイントが何であるかを示すことができます。これを行うには、次をProperties-> Linker-> Command lineに追加します。

/ ENTRY: "mainCRTStartup"

このようにして、コンソールウィンドウを取り除きます。

79

この問題が発生し、Qtを使用している場合-qtmain.libまたはqtmaind.libをリンクする必要があります

9
David Casper

次の行を持つ<tchar.h>を含めます。

#define _tWinMain wWinMain
8
zaki

Unicode文字セットを使用しているが、エントリが設定されていない場合は、/ ENTRY: "wWinMainCRTStartup"を指定できます

6
Petronius

他の人が言ったようにConsole (/SUBSYSTEM:CONSOLE)に変更することに加えて、プロパティ->リンカ->詳細->エントリポイントでエントリポイントを変更する必要があるかもしれません。 mainCRTStartupに設定します。

特に指定しない限り、Visual StudioはmainではなくWinMain関数を検索しているようです。

6
mathiasfk

メイン機能が表示されません。

主な機能があることを確認してください。

例:

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

}

それがうまくいくことを願っています。 :)

4
jefry da gucci

プロジェクトがDllである場合、リンカがコンソールプログラムをビルドしたい場合があります。プロジェクトのプロパティを開きます。一般設定を選択します。構成タイプDynamic Library there(.dll)を選択します。

3
dream_world

そのソースファイルを実行可能ファイルに変換しようとしましたが、必須のエントリポイントであるmain関数が定義されていないため、明らかに不可能です。ファイルmain.cppを追加し、main関数を定義します。コマンドラインで作業している場合(これは疑わしい)、/cを追加して、リンクのみではなくコンパイルのみに追加できます。これによりオブジェクトファイルのみが生成され、静的または共有ライブラリまたはアプリケーションにリンクする必要があります(この場合、mainが定義されたオブジェクトファイルが必要です)。

_WinMainは、リンク時のmainのMicrosoftの名前です。

また、あなたはまだコードを実行していない、あなたはcompiling(そしてリンク)です。 C++はインタープリター言語ではありません。

2
rubenvb

私のこの答えをどこに掲載すればいいかわかりませんが、それは正しい場所だと思います。今日このエラーに出くわしましたが、サブシステムを切り替えても何も変わりませんでした。

64ビットのlibファイルを32ビット(x86)に変更すると、私にとってはうまくいきました。

2
Another Joe

実際にmain()の代わりに_ tWinMain()を使用する場合は、プロジェクトに関連する構成が

  1. リンカ->システム->サブシステム=> Windows(/ SUBSYSTEM:WINDOWS)
  2. C/C++->プリプロセッサ->プリプロセッサ定義=> _CONSOLEを_WINDOWSに置き換え
  3. _ tWinMain()が定義されているc/cppファイルで、以下を追加します。

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

1
Alex

CMakeを使用している場合、コンソールアプリケーションでSET(GUI_TYPE WIN32)を設定すると、このエラーが発生することもあります。

1

上記のエルダイトの提案は、99.99%のケースで問題を解決します。彼らがそうしなかったのは私の運だった。私の場合、別のWindowsプロジェクトのヘッダーファイルを含めていたことが判明しました。案の定、そのファイルの一番下でディレクティブを見つけました:

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

言うまでもなく、この行を削除することで問題が解決しました。

0
Moshe Rubin