zoukankan      html  css  js  c++  java
  • 在VS2015中的SDL2.0开发环境搭建

    写本文的目的在于使用网络上的教程及官方的教程(如:http://www.willusher.io/sdl2%20tutorials/2013/08/15/lesson-0-visual-studio)时,编译时都会有错误:

    Error LNK2019 unresolved external symbol SDL_main referenced in function main_utf8
    
    如果您要解决这个错误直接看测试一节。

    对于新手来讲,还没有入门就是一个大大的打击。枫竹梦使用的是VS2015 Community版本,操作系统win7 x64。


    下载SDL2.0

    先到官网下载SDL2.0,http://www.libsdl.org/download-2.0.php,写本文是最新的版本为2.0.5。需要下载开发包。具体为Development Libraries:下的Visual C++ 32/64-bit,SDL2-devel-2.0.5-VC.zip。下载的编译版本一定要与使用的一致。

    新建项目并配置

    1. 在VS中新建一个Win32 Console的项目,如SDLtest01。新建Console项目的目的是方便输出一些高度信息而已。
    2. 添加一个新的文件main.cpp,并添加main函数,如果已经存在,略过新建文件。
    3. 打开main.cpp所在的目录,新建目录lib。
    4. 将SDL2-devel-2.0.5-VC.zip中的include目录整体复制到main.cpp所在的目录。将SDL2-devel-2.0.5-VC.zip中的lib/x64下的SDL2.lib和SDL2main.lib文件复制到新建的lib中。将SDL2.dll复制到main.cpp所在的目录。具体结构如下:
    SDLtest01/
        lib/
            SDL2.lib
            SDL2main.lib
        include/
            SDL_XXX.h
            ...
        SDL2.dll
        main.cpp
    5. 在VS中右键项目SDLtest01,选择[属性],在上方配置选择所有配置,因为这样对Debug和Release同时进行了设置,平台选择x64。如果您目标对象为Win32,请选择Win32,注意第4步中也需要使用lib/x86下的lib文件。需要配置的地方有3个,包含目录,lib文件和具体的lib文件。
    5.1 选择 配置属性->C/C++->通用,在右侧编辑附加包含目录,添加include目录。

    5.2 选择 配置属性->链接器->通用,在右侧编辑附加库目录,添加lib目录。

    5.3 选择 配置属性->链接器->输入,在右侧编辑附加依赖 项,添加SDL2.lib和SDL2main.lib目录。


    到此已经配置完成。

    测试

    修改mian.cpp文件如下:
    #include <iostream>
    #include <SDL.h>
    
    int main()
    {
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
            return 1;
        }
        SDL_Quit();
        return 0;
    }
    一般教程都是这样的来配置,生成项目,会提示如下错误:

    Error LNK2019 unresolved external symbol SDL_main referenced in function main_utf8

    SDL提供了两种方式来使用,其一是使用自己的main函数,但是需要告诉SDL。方式就是定义宏SDL_MAIN_HANDLED。具体代码如下:
    #include <iostream>
    #define SDL_MAIN_HANDLED
    #include <SDL.h>
    
    int main()
    {
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
            return 1;
        }
        SDL_Quit();
        return 0;
    }

    第二种方式,使用SDL提供的main函数,这也是默认的方式,但此时用户需要提供一个入口函数SDL_main的实现,其原型为:
    int SDL_main(int argc, char *argv[]);

    需要我们提供一个实现:
    #include <iostream>
    #define SDL_MAIN_HANDLED
    #include <SDL.h>
    
    int SDL_main(int argc, char *argv[])
    {
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
            return 1;
        }
        SDL_Quit();
        return 0;
    }

    对于刚入门来讲使用自己定义的main函数的方式来练习就可以,也就是第一种方式。

    总结

    其实遇到这种问题,解决的思路是什么呢?
    首先错误提示表示,main_utf8中调用了SDL_main,但是SDL_main没有定义,那就是搜索一下,很容易定位在SDL_main.h文件。

    /**
     *  file SDL_main.h
     *
     *  Redefine main() on some platforms so that it is called by SDL.
     *  
     */
    #ifndef SDL_MAIN_HANDLED
    #if defined(__WIN32__)
    /* On Windows SDL provides WinMain(), which parses the command line and passes
       the arguments to your main function.
    
       If you provide your own WinMain(), you may define SDL_MAIN_HANDLED <===========
     */

    
    很清楚,如果提供自己的main函数,定义这个宏就可以了。然后接口往下看,
    /**
     *  file SDL_main.h
     *
     *  The application's main() function must be called with C linkage,
     *  and should be declared like this:
     *  code
     *  #ifdef __cplusplus
     *  extern "C"
     *  #endif
     *  int main(int argc, char *argv[])
     *  {
     *  }
     *  endcode
     */
    
    #if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
    #define main    SDL_main
    #endif
    
    /**
     *  The prototype for the application's main() function
     */
    extern C_LINKAGE int SDL_main(int argc, char *argv[]);
    
    
    首先,如果是自己定义的main函数,那么需要定义成

    int main(int argc, char *argv[]);
    而不能使用诸如:
    void main();
    int main();
    ...

    欢迎交流更多的问题。




  • 相关阅读:
    C# winform窗体间传值(使用委托或事件)
    C# ListView用法详解
    C# ListView列表包含添加和删除,自动排序
    C#跨窗体传值的几种方法分析(很详细)
    c#listview控件的数据添加和常用事件的处理
    C#中结构体与字节流互相转换 [StructLayout(LayoutKind.Sequential)]
    C# winform 操作access常用类
    发行自己的区块链加密货币
    以太坊自助发币
    supervisor常用命令
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710154.html
Copyright © 2011-2022 走看看