msys2和SDL2环境搭建

这个周末一直在折腾windows环境,先是准备在Windows上做UNIX网络编程的作业,后来突然想做命令行交互有点枯燥想找到乐子, 突然想到高中写过一点但没深入的SDL2图像库,想到了当初那个拿着树莓派和安卓机写代码的自己,初想没必要去折腾SDL2,直接上qt,但是时间紧迫,qt不是一时半会可以搞得的,

就搭了个SDL2环境,开始因为小事一桩,但无奈我对linux环境毕竟了解,windows反而不行,一直用着的mingw原来有SDL,初以为可以直接开写了,但是对于链接库和gcc不够深入,也没有用makefile写项目经验,便一直不能搭好环境,着实焦急, 幸好今天在同学帮助下,得以成功运行,不得不说笔者同学对于项目构建十分自如,索性把东西记录下来

安装msys2

msys2下载

安装过程没有什么好说

主要是接下来的msys2配置mingw

打开msys2.exe

先检查更新: ` pacman -Syu `

用的还是pacman邪教 :laughing: ,不得不说 good job

我以前用的一直是mingw的整合包,版本太杂,十分混淆视听,如果要用最好直接下载nuwen.net上的,也包含sdl,十分省力,不过为了后续开发方便,我们今天用的是msys2

接下来直接搜索所以mingw64

pacman -Sl | grep mingw64

会看到有很多mingw64的包,不用着急,今天就安gcc和SDL2就行了 pacman -S mingw-w64-x86_64-gcc

pacman -S mingw-w64-x86_64-SDL2

这样的话就算把主要的包安好了,期间会有一些依赖会自动安装,头一次在windows感受包管理的乐趣,之前用vs就没那么自如了 不过除了这两个主要的包还有一些SDL库.为了开发方便都安装比较好

mingw-w64-x86_64-SDL2_gfx 1.0.1-2
mingw-w64-x86_64-SDL2_image 2.0.1-2 
mingw-w64-x86_64-SDL2_mixer 2.0.1-3
mingw-w64-x86_64-SDL2_net 2.0.1-1
mingw-w64-x86_64-SDL2_ttf 2.0.14-1 
mingw-w64-x86_64-SDL_gfx 2.0.25-3

这些包有什么作用就请读者自行搜索,其实从名字也能判断出来 到这里msys2也就配置完成了

环境变量

算是比较重要的配置,笔者之前就是因为环境变量没配好导致无法识别到SDL库 打开windows属性->高级->环境变量 我们直接设置系统变量 找到Path,打开新建吧../msys64/mingw64/bin复制进去,根据你的具体路径填写,这里只做参考 然后回到系统变量,新建一个C_INCLUDEDE_PATH

输入值为D:\msys64\mingw64\include\

再新建一个CPLUS_INCLUDE_PATH

输入D:\msys64\mingw64\include\; D:\msys64\mingw64\include\c++\7.2.0 再新建LIBRARY_PATH

输入D:\msys64\mingw64\lib

到此环境变量配置完毕,接下来的就是gcc的编译配置,如果大型项目也可以用makefile或者cmake等工具,今天也就不多赘述

编译代码

以下是一个SDL2的小demo,来自SDL2官网:

/*This source code copyrighted by Lazy Foo' Productions (2004-2015)
and may not be redistributed without written permission.*/

//Using SDL and standard IO
#include <stdio.h>
#include <SDL2/SDL.h>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
	//The window we'll be rendering to
	SDL_Window* window = NULL;
	
	//The surface contained by the window
	SDL_Surface* screenSurface = NULL;

	//Initialize SDL
	if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
	{
		printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
	}
	else
	{
		//Create window
		window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
		if( window == NULL )
		{
			printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
		}
		else
		{
			//Get window surface
			screenSurface = SDL_GetWindowSurface( window );

			//Fill the surface white
			SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
			
			//Update the surface
			SDL_UpdateWindowSurface( window );

			//Wait two seconds
			SDL_Delay( 2000 );
		}
	}

	//Destroy window
	SDL_DestroyWindow( window );

	//Quit SDL subsystems
	SDL_Quit();

	return 0;
}

编译指令

使用gcc进行编译

g++ a.cpp -lmingw32 -mwindows -lSDL2main -lSDL2 -o a.exe

如果没有报错便可以直接运行,这里笔者出错过很多次,因为没有用对参数顺序,导致报错,所以要学习gcc可以去看看相关文档,不要钻牛角尖 运行输入.\a.exe 便可以看到窗口 可以开始下一步的学习了 :innocent:

Written on September 28, 2017