web-dev-qa-db-ja.com

LNK2019:未解決の外部シンボル_mainが関数___tmainCRTStartupで参照されています

次のエラーLNK2019があります:___tmainCRTStartup関数で参照されている未解決の外部シンボル_main、

このエラーに関連するスレッドはたくさんありますが、これらのソリューションはどれも役に立ちませんでした。そして、このエラーがここにある理由を説明した人はいません。

私は試した:

試していないし、これらも動作しないと疑っています:

このエラーが発生する理由と解決策は何ですか?

27
forest.peterson

あなたのプロジェクトの種類は何ですか? 「Win32プロジェクト」の場合、エントリポイントは(w)WinMainである必要があります。 「Win32コンソールプロジェクト」の場合、(w)mainになります。名前_tmainは、UNICODEが定義されているかどうかに応じて、mainまたはwmainのいずれかに#defineされます。

DLLの場合、DllMain

プロジェクトタイプは、プロジェクトプロパティ、リンカー、システム、サブシステムに表示されます。 「コンソール」または「Windows」と表示されます。

エントリポイント名は、UNICODEが定義されているかどうかによって異なることに注意してください。 VS2008では、デフォルトで定義されています。

Mainの適切なプロトタイプは次のいずれかです

int _tmain(int argc, _TCHAR* argv[])

または

int _tmain()

それらの1つであることを確認してください。

編集:

_TCHARでエラーが発生する場合は、

#include <tchar.h>

問題がヘッダーの1つにあると思われる場合は、main()を使用してファイルのプロパティに移動し、プリプロセッサーで前処理済みファイルの生成を有効にします。次にコンパイルします。 .i拡張子と同じ名前のファイルが取得されます。それを開いて、main()関数に何か不快なことが起こったかどうかを確認します。理論上は不正な#definesが存在する可能性があります...

EDIT2:

UNICODEが定義されている場合(これがデフォルトです)、リンカはエントリポイントがmain()ではなくwmain()であることを期待します。 _tmainには、UNICODEに依存しないという利点があります-mainまたはwmainに変換されます。

少し前に、ANSIビルドとUnicodeビルドの両方を維持する理由がありました。 Unicodeサポートは、Windows 95/98/Meではまったく不完全でした。主要なAPIはANSIであり、Unicodeバージョンはあちこちに存在していましたが、広く普及していませんでした。また、VSデバッガーはUnicode文字列の表示に問題がありました。 NTカーネルOS(Windows 2000/XP/Vista/7/8/10)では、Unicodeサポートが主であり、ANSI機能が追加されています。 VS2005以降、プロジェクト作成時のデフォルトはUnicodeです。つまり-wmain。パラメータタイプが異なるため、同じエントリポイント名を保持できませんでした。 _TCHARは#charまたはwchar_tのいずれかに定義されています。したがって、_tmainはmain(int argc、char ** argv)またはwmain(int argc、wchar_t ** argv)のいずれかです。

ある時点で_tmainでエラーが発生した理由は、おそらくargvのタイプを_TCHAR**に変更しなかったためでしょう。

ANSIをサポートする予定がない場合(おそらくサポートしていない場合)、エントリポイントを次のように再定式化できます。

int wmain(int argc, wchar_t *argv[])

tchar.h include行を削除します。

30
Seva Alekseyev

まだ言及されていないため、これは私にとっての解決策でした:

プロジェクトの新しい構成を作成した後、DLLでこのエラーが発生しました。Project Properties -> Configuration Properties -> Generalに移動し、Configuration TypeDynamic Library (.dll)に変更する必要がありました。

したがって、他のすべてを試しても問題が解決しない場合は、構成タイプがプロジェクトに期待するものかどうかを確認する価値があります。正しく設定されていない場合、コンパイラは間違ったメインシンボルを探します。私の場合、WinMainの代わりにDllMainを探していました。

6
Dizzyspiral

コンソールアプリケーションプロジェクトでプリコンパイル済みヘッダーを無効にし、ヘッダーファイルstdafx.hを削除しようとしたときに、このエラーが発生しました。

これを修正するには、プロジェクトのプロパティ->リンカー->サブシステムに移動し、値をNot Setに変更します

メインクラスで、他の人がすでに言及した標準のC++メイン関数プロトタイプを使用します。

int main(int argc, char** argv)
3

「Win32プロジェクト」+ WinMainを定義し、サブシステムリンカー設定がWINDOWSに設定されている場合、誰かがリンカー設定の「追加オプション」を「/ SUBSYSTEM:CONSOLE」に設定している場合、このリンカーエラーが発生します。この追加設定は、実際のサブシステム設定よりも優先されます。

2
TomSmartBishop

この問題は数分前にありました。 main()の定義に「extern "C"」を追加すると消えました。

奇妙なことに、私が昨日書いた別の簡単なプログラムはほとんど同じで、extern "C"を持ちませんが、このリンカーエラーなしでコンパイルされます。

これにより、問題は設定ダイアログの奥深くにある微妙な設定であり、「extern "C"」は根本的な問題を実際には解決しないが、表面的には機能するように思えます。

1
DarenW

誤って名前空間にwmainを配置すると、このエラーが発生しました。 wmainはどのネームスペースにも入れないでください。さらに、使用しているライブラリの1つにメイン関数があり、VSがメインからメイン関数を取得したため、さらに奇妙になりました。

1
Pagefault

Project-> Properties-> Linker-> System-> SubSystem-> Console(/ subsystem:console)のオプションを選択し、関数を含めるようにしてください:int _tmain(int argc、_TCHAR * argv [] ){return 0}コンパイル、リンク、実行はすべて問題ありません。

1
Shania

興味深い理由で、Visual Studio 2015でもこれが発生しました。他の人に起こった場合に備えて、ここに追加してください。

私はすでにプロジェクトにいくつかのファイルがあり、その中にメイン機能を持つ別のファイルを追加していましたが、最初にファイルを追加したときに拡張子にタイプミスを作成しました(.cppではなく.coo)。私はそれを修正しましたが、完了したときにこのエラーが発生しました。 Visual Studioはスマートであり、ファイルが追加されたときに、最初の拡張子が原因でソースファイルではないと判断しました。

ソリューションエクスプローラーでファイルを右クリックし、[プロパティ]-> [一般]-> [ItemType]を選択して「C/C++コンパイラー」に設定すると、問題が修正されました。

0
Sebastian K

このmainはLinuxとWindowsの両方で動作します-試行錯誤と他の人からの助けを借りて見つけたので、なぜ動作するのか説明できません。ただint main(int argc, char** argv)

いいえtchar.h必要

ここにウィキペディアの同じ答えがあります メイン関数

0
forest.peterson

私の場合、それはHeader Filesセクションのstdafx.hおよびtargetver.hファイルを誤って削除した(削除していない)ためです。

これらのファイルをHeader Filesに追加し直すと、問題は解決します。

私はこれらを持っていました:

#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()

コメントする必要があります(//を前に付けることで)、それは良いことです。

0
Hendy Irawan

以前問題がありましたが、解決しました。主な問題は、誤ってint main()関数のスペルを間違えたことです。 int main()を書く代わりにint mian().... Cheersを書きました!

0

Screen snapshot Visual Studio 2015

前の提案に従って、システムをコンソールに設定します。ただ、文字セットをUnicodeに変更する必要もありました。上記のVisual Studio 2015のスナップショットをご覧ください。

0
LastBlow