在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
新建项目并配置
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文件。
测试
#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函数的方式来练习就可以,也就是第一种方式。
总结
/**
* \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开发环境搭建的更多相关文章
- android 5.0开发环境搭建
Android 5.0 是 Google 于 2014 年 10 月 15 日发布的全新 Android 操作系统.本文将就最新的Android 5.0 开发环境搭建做详细介绍. 工具/原料 jdk- ...
- Hadoop-2.8.0 开发环境搭建(Mac)
Hadoop是一个由Apache基金会开发的分布式系统架构,简称HDFS,具有高容错性.可伸缩性等特点,并且可以部署在低配置的硬件上:同时,提供了高吞吐量的数据访问性能,适用于超大数据集的应用程序,以 ...
- IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像
搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...
- CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建
上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...
- Cocos2d-x.3.0开发环境搭建
配置:win7 + VS2012 + Cocos2d-x.3.0 + Cocos Studio v1.4.0.1 前言:本文介绍在上述配置下进行游戏开发的环境搭建.开发语言为C++.如果读者不需要查看 ...
- AndroidStudio2.0开发环境搭建
实验内容 下载安装Android Studio 配置使用环境 实验要求 下载安装Android Studio 基本环境配置 实验步骤 1.首先从安卓开发者网站下载最新的Android Studio h ...
- MongoDB 4.0 开发环境搭建集群
环境准备 Liunx 服务器一台 以下示例为单机版安装集群, 没有分片 MongoDB 安装 1.下载 MongoDB tgz 安装包: 可以从下载中心下载: https://www.mongodb. ...
- 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 ...
- Cocos2d-x.3.0开发环境搭建之—— 极简式环境搭建
配置:win7 + VS2012 + Cocos2d-x.3.0 + Cocos Studio v1.4.0.1 使用此法可以方便的创建Cocos2d-x项目.如果需要运行Cocos2d-x引擎自带的 ...
随机推荐
- ichartjs 制作的图表
ichartjs资源包下载:https://files.cnblogs.com/files/xiandedanteng/ichartjs-ichartjs1.2.zip 本例下载地址:https:// ...
- Direct-X学习笔记--纹理映射
一.介绍 之前学习了如何绘制物体,还画了个DX自带的茶壶,然而这个东东并不怎么好看....离我们现实的物体简直相隔千里. 仅仅能说像美术他们用来写生的模型...那么要怎么样才干让我们的东西看起来更像真 ...
- dynamic_cast<const ObjectList&>(msg);
说简单的就是C里面的强制类型转换,只不过C++里面为了类型安全而这么做的.主要用于 基类与继承类之间. C写多了,类型一般都强转,特别是指针.int * a;void * b = (void*)a;c ...
- link标签的rel属性
<link>标签定义了当前文档与 Web 集合中其他文档的关系.link 元素是一个空元素,它仅包含属性.此元素只能存在于 head 部分,不过它可出现任何次数.在 HTML 中,< ...
- gitbook 的资源同步到 github中(方便维护和备份)
进入SETTINGS -> Github -> Select a Repository. 到这一步为止,我们可以先去我们的github,创建一个仓库先,推荐同名.然后回来gitbook中, ...
- cocos2d-x-3.1 国际化strings.xml解决乱码问题 (coco2d-x 学习笔记四)
今天写程序的时候发现输出文字乱码,尽管在实际开发中把字符串写在代码里是不好的做法.可是有时候也是为了方便,遇到此问题第一时间在脑子里面联想到android下的strings.xml来做国际化.本文就仅 ...
- php的特殊功能-----不是和其他语言比较
1.header(); 他不只是重定向,和更改字符集 而是发送表头,如 header('HTTP/1.1 404 Not Found gfdgd'); 可以发送信息给浏览器,让浏览器显示404错误 ...
- 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置
package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...
- WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where applicable(附编译脚本)
WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where appli ...
- 【Atheros】无线网卡驱动性能测试工具pktgen的使用
前言:从12年开始做无线驱动相关的工作,到13年大概做了一年半,现在歇了快一年了,以免白学那么久,最近重新整理了一下当时的资料,写一点文章,这方面的帖子比较少,当时碰到过很多问题难以解决,我是用的li ...