写本文的目的在于使用网络上的教程及官方的教程(如: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();
...

欢迎交流更多的问题。






在VS2015中的SDL2.0开发环境搭建的更多相关文章

  1. android 5.0开发环境搭建

    Android 5.0 是 Google 于 2014 年 10 月 15 日发布的全新 Android 操作系统.本文将就最新的Android 5.0 开发环境搭建做详细介绍. 工具/原料 jdk- ...

  2. Hadoop-2.8.0 开发环境搭建(Mac)

    Hadoop是一个由Apache基金会开发的分布式系统架构,简称HDFS,具有高容错性.可伸缩性等特点,并且可以部署在低配置的硬件上:同时,提供了高吞吐量的数据访问性能,适用于超大数据集的应用程序,以 ...

  3. IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像

    搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...

  4. CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建

    上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...

  5. Cocos2d-x.3.0开发环境搭建

    配置:win7 + VS2012 + Cocos2d-x.3.0 + Cocos Studio v1.4.0.1 前言:本文介绍在上述配置下进行游戏开发的环境搭建.开发语言为C++.如果读者不需要查看 ...

  6. AndroidStudio2.0开发环境搭建

    实验内容 下载安装Android Studio 配置使用环境 实验要求 下载安装Android Studio 基本环境配置 实验步骤 1.首先从安卓开发者网站下载最新的Android Studio h ...

  7. MongoDB 4.0 开发环境搭建集群

    环境准备 Liunx 服务器一台 以下示例为单机版安装集群, 没有分片 MongoDB 安装 1.下载 MongoDB tgz 安装包: 可以从下载中心下载: https://www.mongodb. ...

  8. ubuntu16.04 HyperLedger Fabric 1.2.0 开发环境搭建

    安装准备 1. 安装git.cRUL.gcc/g++和make $ sudo apt-get update $ sudo apt-get install build-essential git cur ...

  9. Cocos2d-x.3.0开发环境搭建之—— 极简式环境搭建

    配置:win7 + VS2012 + Cocos2d-x.3.0 + Cocos Studio v1.4.0.1 使用此法可以方便的创建Cocos2d-x项目.如果需要运行Cocos2d-x引擎自带的 ...

随机推荐

  1. 给控件做数字签名之一:将控件打包为Web发布包 [转]

    微软代码签名证书使用指南 http://www.wotrust.com/support/signcode_guide.htm 签名重要性:http://www.wotrust.com/FAQ/whyS ...

  2. antialiasing

    Aliasing发生的原因在于,采样频率过低, 这样就无法重建更接近原来texture的图像, Temporal aliasing在时域上 采的texture 次数太少 不能重建真实 是帧与帧之间,s ...

  3. HDU 5402 Travelling Salesman Problem(多校9 模拟)

    题目链接:pid=5402">http://acm.hdu.edu.cn/showproblem.php?pid=5402 题意:给出一个n×m的矩阵,位置(i.j)有一个非负权值. ...

  4. GIS可视化——聚散图

    一.简介 随着计算机的发展,浏览器的不断进步与完善,现今大部分浏览渲染效率有了很大的改善, 但是由于浏览器厂商的不同,浏览器种类繁多,性能不一,并且很多用户还使用着不少老的浏览, 那些如IE6.7等的 ...

  5. require.js 使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 移动端开发者福利-免费收费api收藏

    一 .api 1.https://www.juhe.cn/ 跟百度api集市差不多,超级赞,做好认证就行了,我有20+认证能用的免费api 2.http://apistore.baidu.com/as ...

  7. PhoneNumber

    项目地址:PhoneNumber 简介:一个获取号码归属地和其他信息(诈骗.骚扰等)的开源库   一个获取号码归属地和其他信息(诈骗.骚扰等)的开源库.支持本地离线(含归属地.骚扰.常用号码)和网络( ...

  8. vuex 中关于 mapGetters 的作用

    mapGetters 工具函数会将 store 中的 getter 映射到局部计算属性中.它的功能和 mapState 非常类似,我们来直接看它的实现: export function mapGett ...

  9. ORACLE数据库导表

    今天在公司的server上面装一个系统,在数据库导表的时候一直导不进去,原先是10g的.dmp文件,导入11g.怀疑版本号不兼容,后来把.dmp表打开,把里面的版本号号改为11g,发现导入还是不行.i ...

  10. 【Sprint3冲刺之前】软件开发计划书

    TD校园助手软件开发计划书 1.引言 1.1 编写目的 为了保证项目团队按时保质地完成项目目标,便于项目团队成员更好地了解项目情况,使项目工作开展的各个过程合理有序,同时便于老师和其他同学了解我们的项 ...