“SDL 入门指南:了解 SDL,快速上手 SDL 的安装和配置”——VS2022

news2024/11/22 21:38:08

在这里插入图片描述

前言

欢迎来到小K的SDL专栏第一小节,本节为大家介绍一下SDL是什么,能做什么,可以在哪些平台运行以及SDL的安装和VS2022配置SDL、导出模板、cmake运行SDL同时我也会在资源里为大家上传SDL2.26的安装包,为在github上下载速度慢的小伙伴提供便捷

在这里插入图片描述

文章目录

    • 前言
    • 一、SDL 简介
      • 1、什么是 SDL?
      • 2、SDL 可以做什么?
      • 3、SDL 在哪些平台上运行?
    • 二、如何获取和安装 SDL
      • 1、SDL2库下载
      • 2、安装SDL2
      • 3、VS中使用SDL2
      • 4、vs导出模板
      • 5、CMake使用SDL2

一、SDL 简介

1、什么是 SDL?

Simple DirectMedia Layer 是一个跨平台开发库,旨在通过 OpenGL 和 Direct3D 提供对音频、键盘、鼠标、游戏杆和图形硬件的低级访问。它被视频播放软件、模拟器和流行游戏使用,包括Valve的获奖目录和许多Humble Bundle游戏。

SDL 正式支持 Windows、Mac OS X、Linux、iOS 和Android。可以在源代码中找到对其他平台的支持。

SDL 是用 C 编写的,在本机上与 C++ 一起使用,并且有适用于其他几种语言的绑定,包括 C# 和 Python。

SDL 2.0 在zlib 许可下分发。此许可证允许您在任何软件中自由使用 SDL。简单直接媒体层库 (SDL) 是一个通用 API,它提供对音频、键盘、鼠标、游戏杆、通过 OpenGL 的 3D 硬件以及跨多个平台的 2D 帧缓冲区的低级别访问。

2、SDL 可以做什么?

视频

  • 3D图形:SDL 可与 OpenGL API 或 Direct3D API 结合使用,用于 3D 图形
  • 加速 2D 渲染 API:支持简单的旋转、缩放和 alpha 混合,所有这些都使用现代 3D API 加速,使用 OpenGL 和 Direct3D 支持加速
  • 创建和管理多个窗口

输入事件

  • 提供的事件和 API 函数用于:
    • 应用程序和窗口状态更改
    • 鼠标输入
    • 键盘输入
    • 操纵杆和游戏控制器输入
    • 多点触控手势
  • 可以使用SDL_EventState ()启用或禁用每个事件
  • 事件在发布到内部事件队列之前通过用户指定的过滤器函数
  • 线程安全事件队列

力反馈

  • Windows、Mac OS X 和 Linux 支持力反馈

音频

  • 设置8位和16位音频、单声道立体声或5.1环绕声的音频播放,如果硬件不支持格式,可选择转换
  • 音频在单独的线程中独立运行,通过用户回调机制填充
  • 专为定制软件混音器设计,但SDL_mixer提供完整的音频/音乐输出库

文件 I/O 抽象

  • 用于打开、读取和写入数据的通用抽象
  • 对文件和内存的内置支持

共享对象支持

  • 加载共享对象(Windows 上的 DLL,Mac OS X 上的 .dylib,Linux 上的 .so)
  • 共享对象中的查找函数

线程

  • 简单的线程创建API
  • 简单线程本地存储API
  • 互斥体、信号量和条件变量
  • 无锁编程的原子操作

计时器

  • 获取经过的毫秒数
  • 等待指定的毫秒数
  • 在单独的线程中创建与代码一起运行的计时器
  • 使用高分辨率计数器进行分析

CPU 特性检测

  • 查询CPU数量
  • 检测 CPU 特性和支持的指令集

大端小端支持

  • 检测当前系统的字节序
  • 用于快速交换数据值的例程
  • 读取和写入指定字节序的数据

电池管理

  • 查询电源管理状态

3、SDL 在哪些平台上运行?

Windows

  • 使用 Win32 API 进行显示,利用 Direct3D 进行硬件加速
  • 使用 DirectSound 和 XAudio2 作为声音

Mac OS X

  • 使用 Cocoa 进行视频显示,利用 OpenGL 进行硬件加速
  • 使用 Core Audio 播放声音

Linux

  • 使用 X11 进行视频显示,利用 OpenGL 进行硬件加速
  • 使用 ALSA、OSS 和 PulseAudio API 来处理声音

IOS

  • 使用 UIKit 进行视频显示,利用 OpenGL ES 2.0 进行硬件加速
  • 使用 Core Audio 播放声音

Android

  • 使用 JNI 接口进行视频显示,利用 OpenGL ES 1.1 和 2.0 进行硬件加速
  • 对声音使用 JNI 音频回调

二、如何获取和安装 SDL

1、SDL2库下载

  • SDL2 核心库 SDL2

  • SDL2 拓展库 SDL2_image、SDL2_ttf、SDL2_mixer、SDL2_net

  • SDL2 第三方绘图库SDL2_gfx 官网 , SDL2_gfx Github

2、安装SDL2

1. 点击SDL2 核心库下载下载SDL2库,进入GitHub下载。

在这里插入图片描述
在这里插入图片描述
2. 下载出来会有一个压缩包,放到一个合适的目录(记住这个目录哦,经常要用的),解压。

在这里插入图片描述

3. 进入解压后的目录,如下图:
A. cmake:cmake配置文件
B. docs:文档目录,只不过都是英文的
C. include:头文件目录,编程需要的
D. lib:库目录(静态库和动态库都有)
在这里插入图片描述

4. 给环境变量添加库目录,让程序运行的时候能够找到动态库。PS:配置好了记得重启Vs这里配的是X64,需要X86的自己换一下就好了

在这里插入图片描述

3、VS中使用SDL2

1. 创建一个空项目,如下图:

在这里插入图片描述

2. 进入菜单栏的项目->属性->VC++ 目录,配置包含目录和库目录(详见下图),注意库目录的版本和你的项目版本要一直哦(图中两个三角形标记的位置,我这是x64的)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 不要离开,还有静态库需要配置,进入链接器->输入->点击附加依赖项->填入SDL2.lib和SDLmain2.lib,然后确定就好

在这里插入图片描述

4. 最后加入如下代码,Ctrl+F5运行

#include<SDL.h>

int main(int argc,char*argv[])
{
	//初始化SDL
	if (SDL_Init(SDL_INIT_VIDEO) <0)
	{
		SDL_Log("can not init SDL:%s", SDL_GetError());
		return -1;
	}

	return 0;
}

在这里插入图片描述

如果能出现黑窗口并且,没有任何错误提示,那么就恭喜你啦,SDL配置完成(不过麻烦的是每次创建新项目和在x86,x64之间切换时都要进行配置,后面将讲解更方便的方法)

SDL 作为动态链接库。动态链接库包含 3 个部分:

  • 头文件 (Library.h)
  • 库文件(Windows 的Library.lib 或 *nix 的libLibrary.a)
  • 二进制文件(Windows 的Library.dll 或*nix 的Library.so)

✨你的编译器需要能够在编译时找到头文件,以便它知道SDL 函数和结构是什么。可以将编译器配置为在 SDL 头文件所在的附加目录中进行搜索,或者将头文件与编译器附带的其余头文件一起放入。如果编译器提示找不到 SDL.h,则意味着头文件不在编译器查找头文件的位置。

✨在编译器编译所有源文件后,它必须将它们链接在一起。为了使程序正确链接,它需要知道所有函数的地址,包括 SDL 函数的地址。对于动态链接库,这些地址在库文件中。库文件具有导入地址表,因此您的程序可以在运行时导入函数。与头文件一样,您可以将编译器配置为在 SDL 库文件所在的附加目录中进行搜索,或者将库文件与编译器附带的其余库文件一起放入。您还必须告诉链接器链接到链接器中的库文件。如果链接器报错找不到-lSDL或SDL2.lib,它意味着库文件不在链接器寻找库文件的地方。 如果链接器报错了一个未定义的引用,这可能意味着它没有链接这个库。

✨在您的程序被编译和链接之后,您需要能够在运行时链接到该库。为了运行动态链接的应用程序,您需要能够在运行时导入库二进制文件。当您运行程序时,您的操作系统需要能够找到库二进制文件。您可以将库二进制文件放在与可执行文件相同的目录中,也可以放在操作系统保存库二进制文件的目录中。

4、vs导出模板

项目->导出模板,模板名称,介绍,图片都根据自己喜好天就好了,输出位置就是模板的位置,创建完之后,打开VS创建新项目就有了像创建空项目的快捷方式,不用每次都配置了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、CMake使用SDL2

1. 把SDL2的根目录,配置到环境变量D:\BaiduNetdiskDownload\SDL2\SDL2-2.26.1,配置你自己的目录
2. 创建CMake项目,并在CMakeLists.txt文件中写入如下命令

#CMake最小请求版本
cmake_minimum_required (VERSION 3.8)

#项目名称
project ("SDL2_CMake")

#查找SDL2包,REQUIRED强制请求,没找到报错
find_package(SDL2 REQUIRED)

#使用指定的源文件生成目标(SDL2_CMake)
add_executable (SDL2_CMake "main.c")

#指定目标在链接时需要的依赖(库)
target_link_libraries(SDL2_CMake SDL2::SDL2 SDL2::SDL2main)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扫地机洗地机语音芯片ic一体方案 WTV多功能语音芯片

​随着智能家居的快速普及&#xff0c;扫拖一体机语音芯片ic逐渐成为了家庭清洁的必备之物。在智能家居、商业清洁服务、医院清洁服务、办公室清洁等领域得到广泛应用&#xff1b;而语音芯片方案的应用让清洁机器设备使用起来更加方便和智能化。 编辑搜图 目前大多数扫地机厂家…

2023/5/4总结

刷题&#xff1a; 第二周任务 - Virtual Judge (vjudge.net) 这一题用到了素筛,然后穷举即可 #include<stdio.h> #define Maxsize 500000 int a[Maxsize]; long long b[Maxsize]; long long max0; int sushu() {a[0]a[1]0;int i,j,k;for(i2,k0;i<Maxsize;i){if(a[i…

jeecgboot online代码生成 一对多

首先把前后端环境都起起来&#xff0c;此处略 点击online表单开发&#xff0c;设计主附表&#xff0c;表示一对多(一对一)关系&#xff0c;“一”对应主表&#xff0c;“多”对应附表&#xff0c;如图 表设计完成&#xff0c;点击同步可直接在数据库中生成数据表。 附表注意…

卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

今天的事务的基础上继续找出错点

今天的事务的基础上继续找出错点 2023-05-05 08:21:40.362 ERROR 5560 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested…

手机摄影笔记(一)

人像裁剪注意&#xff1a; 不要在人像的脚踝&#xff0c;膝盖&#xff0c;手肘&#xff0c;手腕处进行裁剪&#xff0c;这样会显得残缺&#xff0c;因为这些位置属于转折位置&#xff0c;不光滑的&#xff0c;上下差别很大。而在手臂&#xff0c;大腿等其他地方进行裁剪&#x…

ThingsBoard教程(三八):规则节点解析 筛选脚本 script,路由分支 switch

前言 本篇文件继续介绍规则节点中的 筛选类型的节点, 筛选脚本 script 可以通过js编程,使用消息体中的书籍,来实现返回true或false。 路由分支 switch : 将传入消息路由到一个或多个输出连接。节点执行配置的TBEL(推荐)或返回字符串数组(连接名称)的JavaScript函数。 …

《花雕学AI》30:ChatGPT的资料来源比例排名前20名是什么?

引言&#xff1a;ChatGPT是一款由OpenAI开发的人工智能聊天机器人&#xff0c;它可以回答各种问题&#xff0c;并生成创意内容&#xff0c;如诗歌、故事、代码等。 ChatGPT的核心技术是基于GPT-3.5和GPT-4的大型语言模型&#xff0c;它可以利用从网路上收集的大量文本资料来进行…

《一》Node 基础

Node&#xff1a;是一个基于 V8 引擎的 JavaScript 运行的环境。 V8 引擎可以嵌入到任何 C 应用程序中&#xff0c;无论是 Chrome 浏览器还是 Node&#xff0c;事实上都是嵌入了 V8 引擎来执行 JavaScript 代码的。 Node 架构&#xff1a; 编写的 JavaScript 代码首先经过 V8 引…

Springframework和Hibernate版本对应关系

org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework 3.2.x对应org.hibernate4.2.x版本 org.springframework 4.0.x对应org.hibernate4.3.x版本 org.springframework 4.1.x对应org.hibernate5.0.x版本 org.springframework 4.3.x对应org.hibernate5.…

TOB企业如何构建自身的生态力

众所周知&#xff0c;企业服务赛道业务涉及范围非常多&#xff0c;其面向的客户分布广、触达过程长、需求场景复杂、功能集成和持续服务要求高等特点&#xff0c;就决定了To B企业无法通过单枪匹马的运营模式&#xff0c;来满足增长和健康运营的需求。 随着市场的竞争日益加剧…

【Docker】镜像与docker数据卷

文章目录 一、镜像1、镜像2、镜像原理之联合文件系统3、镜像原理之分层4、commit镜像 二、数据卷1、数据卷2、-v使用数据卷3、实战&#xff1a;MySQL 同步数据4、docker volume相关指令5、匿名和具名挂载6、数据卷之Dockerfile7、数据卷容器 一、镜像 1、镜像 镜像是一种轻量级…

k8s笔记25--k8s 跨主机网络flannel

k8s笔记25-- k8s 跨主机网络flannel 简介不同机器上网络设备区别flannel 网络常见三大后端模式UDPVXLANhost-gw 如何查看集群用哪种网络模式阿里云flannel容器网络 alloc参考文档 简介 在单机环境下&#xff0c;容器间可以通过 docker0 网桥来通信&#xff0c;但其无法实现不同…

QT QGridLayout网格布局控件

本文详细的介绍了QHBoxLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、控件布局、获取行、获取列、某行伸缩系数、某列伸缩系数、某列最小宽度、某行最小宽度、总单元格数、移除布局条目、移动布局条目、其它文章等操作。 实际开发中&#xff0c;一个界面上可能包…

【小程序】 键盘和表情同时存在时候,输入框上移问题

键盘和表情 效果图实现方法引入的js文件&#xff0c;文件名emoji.js&#xff0c;存放在untils路径下 效果图 实现过程&#xff0c;监听键盘高度的同时&#xff0c;判断是否获取到焦点样式上&#xff0c;swiper实现左右按页滑动效果 实现方法 <template><view class&…

IDEA常用配置及使用技巧

文章目录 下载插件JRebel and XRebelChinese Language PackMybatis XEasyCodeTranslationAuto filling Java call argumentsCodota AI Autocomplete for Java and JavaScriptAlibaba Java Coding GuidelinesEasyYapiGenerateAllSetterGit Commit TemplateGitToolBoxSQL Params …

基于YOLOv5的儿童睡眠检测

注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;部分步骤将在 基于x86架构CPU的开发环境中完成 一、初始化开发环境(基于x86架构CPU的开发环境中完成) 二、模型转换 (基于x86架构CPU的开发环境中完成) 三、YOLOv5模型部署测试&#xff08;在SOPHGO SE5…

FT2000+ qemu kvm 64C64G 通过频繁设置CPU online 状态导致虚拟机openEuler 操作系统假死测试用例2

前文&#xff1a; https://hknaruto.blog.csdn.net/article/details/130408240 测试程序 /** tcti.cpp参考&#xff1a; https://www.cnblogs.com/organic/p/17321523.htmlg -stdc11 -lpthread trigger_cgroup_timer_inactive.cpp -o inactive_timer ./inactive_timer 100000…

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时&#xff0c;必定能在各种教材资料里见到以下三种网络模型&#xff1a; 三种模型间的差异&#xff1a; OSI七层模型是理论上的网络模型&#xff0c;从功能方面分成了相对独立的7个层次&#xff0c;由于太复…

如何通过 Rancher 轻松实现多云部署

“多云”通过不同的云厂商分发应用程序提高了弹性&#xff0c;能够帮助企业强化自身的竞争力。此外&#xff0c;多云还降低了被云厂商锁定的可能性&#xff0c;让企业避免过于依赖某个云厂商。 虽然多云的优势很多&#xff0c;但是管理多云 Kubernetes 的困难还是让人望而却步…