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


143

以下のような単純なコードを実行しているときに、次の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

私は何をすべきか?


1
これはすべてのコードですか?主な機能はどこですか?
Connman、2011

2
また、プロジェクトのタイプが正しく設定されていないようです。WinMainに関するリンカーエラーは、Win32プロジェクトを作成しようとしたことを意味します。コマンドプロンプトにテキストを出力するだけの場合は、プロジェクトタイプをコンソールに変更してみてください。
キラナッシュ2011

4
ちなみに、コンパイラ/リンカーエラーが発生した場合は、コードを「実行」していません。
アンドレカロン

1
プロジェクトタイプを変更しようとしましたが、コンソールの代わりにproject = exeが機能しました。
Dom

回答:


352

それはリンカの問題です。

プロパティ->リンカ->システム->サブシステム(Visual Studio内)を変更してみます。

以下からのWindows(/ SUBSYSTEM:WINDOWS)へのコンソール(/ SUBSYSTEM:CONSOLE)

これは私を助けました


3
同じ問題があります。あなたの答えは役に立たない。その他の提案はありますか?
Parth Sane 2014

1
MS Visual Studioを使用すると、その問題が発生しました。環境が異なる場合は、別の方法で修正する必要があります。しかし、それはまだリンカーの問題であるはずです。
Bohdan 2014年

2
使用している場合はtWinMain、あなたの主な機能として、あなたはTCHAR.H含まなければならない のどちらかに変更するWinMainか、wWinMainあなたのアプリケーションがUnicodeであるか否かに応じて。そうしないと、正しいサブシステムであっても、このリンカーエラーが発生します。(/サブシステム:ウィンドウ)
lisa

これは私を助けましたが、アバストアンチウイルスを無効にする必要もありました。
XCS

1
これは、プラットフォームとタイプの両方に「すべての構成」を選択した後にのみ機能しました。「ソリューション」で「ビルド」を選択すると、すべてをビルドしようとしましたが、最初に試みたのはコンソールサブシステムに指定されたものではありませんでした。
ジョセフ・ステートソン、

83

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

または、Windowsサブシステムを保持したい場合は、定義していないので、エントリポイントが何であるかをヒントにできます___tmainCRTStartup。これを行うには、次の行をプロパティ->リンカー->コマンドラインに追加します

/ ENTRY: "mainCRTStartup"

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


3
+1:「これにより、コンソールウィンドウを削除できます。」- 涼しい!sthを学んだ。今日は新しい!
Valentin Heinitz 14年

1
アドバイスのために+1、私はこれを20分ほど理解しようとしました。SFMLを使用すると、サブシステムWindowsを指定できるので、GLFWを使用すると明らかに違いがありません(=
daniel

14

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


これは、プロジェクト->プロパティ->リンカ->入力にあります。追加の$(QTDIR)\lib\qtmaind.lib依存関係に追加します。
mathiasfk

1
ファイルに追加CONFIG += consoleする.proと、Qtプロジェクトの問題が修正されました
Synck

12

変更する以外にもConsole (/SUBSYSTEM:CONSOLE)他の人が言ってきたように、あなたが変更する必要がありますエントリポイントをプロパティに- >リンカ- >詳細設定- >エントリポイント。mainCRTStartupに設定します

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



7

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


私にとってのライフセーバー!私はcmakeの+ MFC(ユニコード)使用していた
malat

4

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

メイン機能があることを確認してください。

例:

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

}

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


これは役に立ちません。リンカは、未定義のWinMainエントリポイントについて不平を言っています。呼び出されるエントリポイントを定義mainしても、それを解決することはありません。
IInspectable 2018年

リンカーは異なるmain/ WinMainバージョンを解決しようとしますが、それらが見つからない場合はWinMain @ 16 not foundと表示されますが、このメッセージは正確ではありません。
Lorinczy Zsigmond

3

プロジェクトがDLLの場合は、リンカーがコンソールプログラムをビルドしたい場合があります。プロジェクトのプロパティを開きます。一般設定を選択します。そこで構成タイプのダイナミックライブラリ(.dll)を選択します。


私はまさにその問題を抱えていますが、.dllコンパイラはまだWindowsアプリを構築しようとしています。
トマーシュZato -復活モニカ

3

私のこの答えをどこに投稿するかわかりませんが、それは正しい場所だと思います。今日、このエラーに遭遇しましたが、サブシステムを切り替えても問題はありませんでした。

64ビットのlibファイルを32ビット(x86)に変更するとうまくいきました。誰かの助けになるといいですね!


私はこれを試してみましたが、同じターゲットへの依存関係の再コンパイルも機能します。
Jamie Nicholl-Shelley

ユニットテストウィザードが32ビットのエントリポイントを使用しているようでもあります
Erik Aronesty

3

あなたは、実際に使用したい場合は_tWinMainを()の代わりに、main()の 確認、プロジェクト関連の設定を持たせます

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

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


2

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

_WinMainmainリンク時のMicrosoftの名前です。

また、まだコードを実行しておらず、コードをコンパイル(およびリンク)しています。C ++はインタープリター型言語ではありません。


5
実際には、WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)エントリポイントが必要です。このリンカーエラーは、プロジェクトがコンソールサブシステムではなくWindowsサブシステム用にビルドされていることを示しています。
Adam Maras

@Adam:ああ、はい、私はQtに甘やかされています:)(WinMainを効果的に隠しています)。
rubenvb

WinMainはWindowsアプリケーション専用です。コンソールアプリは別の名前_tmainを使用し、Unicode / MBCS設定に応じてmainまたはwmainに解決されます。
Steve Townsend

@AdamMaras、完璧です。必要な大文字とプロトタイプを探していました。今では完全に動作します。ありがとう!
Synetech 2015

_WinMain@16Windowsサブシステムをターゲットとする場合に、CRTのスタートアップコードによって呼び出されるユーザー提供のエントリポイントの装飾されたシンボルです。mainリンク時のマイクロソフトの名前」ではありません。コンソールサブシステムを対象とする場合、Visual Studioに付属するCRTはという名前のエントリポイントを呼び出しますmain。未定義の場合、リンカはと呼ばれるシンボルの欠落について文句を言い_mainます。
IInspectable 2018年

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.