7

Visual Studio 2008 Express で C++ の SDL を使用しようとしています。次のプログラムはコンパイルされますが、リンクされません。

#include <SDL.h>

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

リンク エラーは次のとおりです。

LINK : fatal error LNK1561: entry point must be defined

SDL.lib および SDLmain.lib とリンクする方法またはリンクするかどうかに関係なく、これを取得します。またはmainとして定義すると、 の有無にかかわらず、同じエラーが発生します。main()SDL_main()extern "C"

編集:main.cppにSDL.hを含めないことでこれを解決しました-問題とは無関係にリファクタリングを行いました。同様の解決策は#undef main、関数を定義する直前です。

4

3 に答える 3

6

現時点では VC++ を利用できませんが、この問題を何度か目にしました。

コンソール プロジェクトではなく、Win32 プロジェクトを作成する必要があります。Win32 プロジェクトは、プログラムのエントリ ポイントとしてWinMain関数を想定しています。SDLmain.lib にはこのエントリ ポイントが含まれており、SDL_main.h ヘッダー ファイルにはメイン関数を SDL_main に再マップするマクロがあります。この関数は、SDLmain ライブラリのエントリ ポイントによって呼び出されます。

メイン関数には次の署名が必要です。

int main(int argc, char *argv[])

また、メイン関数の宣言の前に SDL.h を含める必要があり、SDL.lib と SDLmain.lib の両方にリンクする必要があります。

あなたはこれをやっているようです。つまり、コンソール プロジェクトがセットアップされていると思います。したがって、リンカは呼び出すメイン関数を探していますが、マクロ SDL_main.h によって SDL_main に再マップされています。そのため、リンカはエントリ ポイントを見つけることができず、あきらめてしまいます。

于 2008-12-28T15:53:55.617 に答える
3

私にとっては、main() の前に次の行を追加するのに役立ちました。

#ifdef _WIN32
#undef main
#endif

ドイツ語のウィキペディアでは、代わりに次の行を追加することも提案しています。

#ifdef _WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif

2番目の解決策を試したとき、まだリンクエラーがありました。

于 2009-03-20T17:19:41.930 に答える
0

リンカーがエントリ ポイントを見つけられません。これは、 main() 関数がエントリ ポイントとして認識されないことを意味します。

.def ファイルがある場合は、それを削除します。

また、プロジェクトを mbcs ではなく unicode でコンパイルするように設定した場合は、main() の代わりに wmain() を使用する必要があります。

于 2008-12-28T15:31:49.780 に答える