web-dev-qa-db-ja.com

SDL2:LNK1561:エントリポイントを定義する必要があります

このコードをコンパイルしたい:

#include <SDL.h>

int main(int argc, char* argv[]) {
    return 0;
}

ただし、リンクすることはできません:Error 1 error LNK1561: entry point must be defined

このライブラリにはいくつかの奇妙なコードがあります: http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main    SDL_main

また、SDL2.lib;SDL2main.lib to Project Settings => Linker => Input。

このプロジェクトを実行するにはどうすればよいですか?
VS 2012 SP3、空のC++プロジェクト。

15
Dmitry

Dream.In.Codeの this thread によると:

プロジェクト名を右クリック->プロパティ->リンカータブを展開->システム->サブシステム:Console (/SUBSYSTEM:CONSOLE)であることを確認します

または、コンソールウィンドウを非表示にする場合、または マルチスレッドアプリケーションのデバッグ の場合は、代わりにSubSystemをWindow (/SUBSYSTEM:WINDOW)に設定する必要があります。

41
4pie0

/ SUBSYSTEM:CONSOLEの設定はソリューションの半分にすぎないことがわかりました。後半では、追加の定義にSDL_MAIN_HANDLEDを追加します。これを解決するために私が使用した手がかりはSDL_main.hにあります。 SDL_MAIN_HANDLEDを設定すると、SDLヘッダーファイルに、main関数が既に提供されており、独自のエントリポイントを再定義したくないことを伝えます。

4
dpiron

しないでください#undef main! SDL側で再定義するのは非常に悪い習慣ですが、それらには正当な理由があります。WinMainがライブラリ側で定義され、いくつかの初期化コードを実行して互換性の問題を解決するために使用されます。 (SteamやAndroidなどの他のプラットフォームへの移植など、さまざまなSDL実装を使用する場合はさらに多くなります)

それで、あなたは何をすべきですか? Windowsでは、常にSDL2main.libの前にSDL2.libを含め、メインが次の形式であることを確認してください。

int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT

出典: SDL2 Windows FAQ

2
Gustavo Maciel

tinky_winkiが書いたように

プロジェクト名を右クリック->プロパティ->リンカタブを展開->システム->サブシステム:コンソール(/ SUBSYSTEM:CONSOLE)であることを確認します

しかし、ウィンドウ付きのコンソールを期待しない場合は、単に/ SUBSYSTEM:WINDOWSを使用してください。

1
Łukasz Mleczko

プロジェクト>>プロパティ>>リンカ>>詳細設定>>エントリポイント=メインおよび適用

0
Michał Rugbuś