29

次のエラーがあります。

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

このエラーに関連するスレッドはたくさんありますが、それらの解決策はどれもうまくいきませんでした。そして、このエラーがここにある理由を説明した人はいません。

私は試した:

  • wWinMainCRTStartupリンカー プロパティのエントリ ポイントとして (スレッド)
  • リンカーを「Windows」に設定します(上記と同じスレッド)
  • ソリューション名を右クリック->追加->既存のアイテム->メインのファイル(上記と同じスレッド)
  • #include <tchar.h>(エラー LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されています)
  • プロジェクト + プロパティ、C/C++、コード生成、バッファ セキュリティ チェック = いいえ (スレッド)を試す
  • オプション: C/C++、コード生成、ランタイム ライブラリ=/MTd; C/C++、コード生成、基本ランタイム チェック = デフォルト; C/C++、コード生成、バッファ セキュリティ チェック=No; リンカー、高度な、エントリ ポイント = メイン (スレッド)
  • main.cppexceptusing namespace stdおよび-のヘッダーをコメントアウトすると#include <iostream>、それらのヘッダーを参照する関数からカスケードおよびスノーボール エラーが発生します。
  • テスト コード以外のすべてを削除し、main.cppを除くすべてのソース ファイルを除外しましmain.cppた。期待どおりに機能したので、正しい方向への小さな一歩です。問題はヘッダー ファイルの 1 つにあるはずです。
  • Win32 Windows アプリケーション テンプレート (スレッドスレッド)を使用して新しいプロジェクトを作成します。

これらも機能しないことを試していませんでした:

  • 使用int main()(ファイル名またはメイン関数名の意味がわからない)(スレッド
  • cmakeWindows 7 x64 でのビルドに使用(スレッド)

このエラーが発生するのはなぜですか?また、解決策は何ですか?

4

12 に答える 12

31

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

DLL の場合は、DllMain.

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

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

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

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 ビルドの両方を維持する理由がありました。Windows 95/98/Me では、Unicode のサポートが非常に不完全でした。主な API は ANSI であり、Unicode バージョンがあちこちに存在していましたが、普及していませんでした。また、VS デバッガーでは Unicode 文字列の表示に問題がありました。NT カーネル OS (Windows 2000/XP/Vista/7/8/10) では、Unicode サポートが第一であり、ANSI 関数が追加されています。そのため、VS2005 以降、プロジェクト作成時のデフォルトは Unicode です。つまり、wmain. パラメータの型が異なるため、同じエントリ ポイント名を保持できませんでした。_TCHAR は #defined で、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インクルード行を削除します。

于 2012-06-28T15:27:20.350 に答える
6

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

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

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

于 2014-03-11T16:58:24.670 に答える
3

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

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

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

int main(int argc, char** argv)
于 2013-04-17T15:33:51.380 に答える
2

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

于 2015-03-05T08:59:19.537 に答える
1

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

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

これは、問題がいくつかの構成ダイアログの奥深くにある微妙な設定であり、「extern "C"」は根本的な問題を実際には解決しないが、表面的には物事を機能させると私に思わせます。

于 2014-12-31T21:12:33.577 に答える
0

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

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

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

于 2015-10-03T22:59:59.997 に答える
0

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

不要tchar.h_

ウィキペディアのメイン関数と同じ答えです

于 2013-03-08T19:33:32.360 に答える