msys2和SDL2环境搭建
这个周末一直在折腾windows环境,先是准备在Windows上做UNIX网络编程的作业,后来突然想做命令行交互有点枯燥想找到乐子, 突然想到高中写过一点但没深入的SDL2图像库,想到了当初那个拿着树莓派和安卓机写代码的自己,初想没必要去折腾SDL2,直接上qt,但是时间紧迫,qt不是一时半会可以搞得的,
就搭了个SDL2环境,开始因为小事一桩,但无奈我对linux环境毕竟了解,windows反而不行,一直用着的mingw原来有SDL,初以为可以直接开写了,但是对于链接库和gcc不够深入,也没有用makefile写项目经验,便一直不能搭好环境,着实焦急, 幸好今天在同学帮助下,得以成功运行,不得不说笔者同学对于项目构建十分自如,索性把东西记录下来
安装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: