如何在 Visual Studio 2008 Express 中获得一个最小的 SDL 程序来编译和链接?

Posted

技术标签:

【中文标题】如何在 Visual Studio 2008 Express 中获得一个最小的 SDL 程序来编译和链接?【英文标题】:How do you get a minimal SDL program to compile and link in visual studio 2008 express? 【发布时间】:2008-12-28 14:03:48 【问题描述】:

我正在尝试在 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

【问题讨论】:

【参考方案1】:

我目前没有可用的 VC++,但我已经多次看到这个问题。

您需要创建一个 Win32 项目而不是控制台项目。 Win32 项目需要WinMain 函数作为程序入口点。 SDLmain.lib 包含此入口点,并且 SDL_main.h 头文件有一个宏,可将您的 main 函数重新映射到 SDL_main。该函数由 SDLmain 库中的入口点调用。

主函数必须具有以下签名:

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

在你的main函数声明之前还需要包含SDL.h,并且你需要同时链接到SDL.lib和SDLmain.lib。

看起来你正在这样做。 所以,我猜你有一个控制台项目设置。因此,链接器正在寻找一个要调用的主函数,但它被宏 SDL_main.h 重新映射到 SDL_main。所以,链接器找不到入口点就放弃了!

【讨论】:

是的,从 Windows 应用程序更改(通过项目属性/配置属性/链接器/系统/子系统)有效。谢谢。 (不过,我最终得到了不同的解决方案)【参考方案2】:

对我来说,在 main() 之前添加以下几行很有帮助:

#ifdef _WIN32
#undef main
#endif

German Wikipedia 还建议添加这些行:

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

虽然我在尝试第二种解决方案时仍然遇到链接错误。

【讨论】:

【参考方案3】:

链接器找不到入口点。这意味着您的 main() 函数未被识别为入口点。

如果您有 .def 文件,请将其删除。

此外,如果您已将项目设置为使用 unicode 而不是 mbcs 进行编译,则必须使用 wmain() 而不是 main()。

【讨论】:

以上是关于如何在 Visual Studio 2008 Express 中获得一个最小的 SDL 程序来编译和链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点

visual studio 2008如何引用dll

如何在visual studio2008中创建,编译和运行C++程序,

如何在 Visual Studio 2008 中自动删除尾随空格?

Visual Studio 2008 / C#:如何在项目中查找死代码?

如何在 Visual Studio 2008 中折叠选定的代码块?