在LoongArch上编译SDL2最新版(2.26)旧世界

一、关于LoongArch:

    LoongArch基于龙芯二十年的CPU研制和生态建设积累,从顶层架构,到指令功能和ABI标准等,全部自主设计的指令集,在龙芯3A5000上首次采用。个人基于兴趣爱好,从某宝低价购入了板U套装(¥768),正好又需要SDL2的最新版,因此踩了一下坑,记录一下过程,给大家参考一下。

二、关于SDL2:

    SDL( Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库, 使用 C 语
言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数, 让开发者只要用相同或是相似的
代码就可以开发出跨多个平台( Linux、 Windows、 Mac OS X 等) 的应用软件。 目前 SDL 多
用于开发游戏、 模拟器、 媒体播放器等多媒体应用领域。截止2023年5月,SDL3已经在开发的过程中。

SDL2多媒体库包括:

        SDL2:基础库

        SDL2_mixer:音频扩展

        SDL2_ttf:字体扩展

        SDL2_image:图像扩展

        SDL2_net:网络扩展

三、源码下载及构成:

     SDL库及其依赖库均可以从 Simple Directmedia Layer · GitHub 搜索下载,git clone或者网页download zip,选择一种自己习惯的方式即可。

首先来看SDL的构成,进入目录后,子目录如下:

最重要的是include和src文件夹, include目录为后期在项目使用SDL库时必须包含的目录,里面有SDL的.h头文件,src目录内为源码,已经包含了include里的.h文件。其他目录大部分为编译的工程目录,比如VisualC中有vc++工程,可以直接使用,略作修改即可采用VS编译。

接下来是SDL的扩展库,这里以SDL_mixer为例,其他扩增库都是大同小异。

 相对于SDL基础库,扩展库的重要目录增加了一个external文件夹,里面是扩展库的依赖库。

三、前期准备:

新建一个目录,将下载的SDL库都解压放入其中,注意不要有文件夹套文件夹的情况,新建一个子目录用于存放编译好的库文件(例子中为00_bin),再新建一个子目录用于存放编译过程文件(例子中为01_build),SDL提供了cmake编译方式,同时不支持在源码目录内cmake,因此需要采用另外的目录。整体目录结构的例子如下:

目录准备好了,接下来准备工具,首先是cmake。

终端中输入cmake,如果提示未知命令,用sudo apt-get install cmake 安装cmake工具。

安装音频驱动库:sudo apt-get install libasound2-dev libpulse-dev

安装这两个库与SDL的工作方式有关,进入SDL的src文件夹,里面的每个目录表示一个模块,如audio为音频模块,进入audio文件夹,可以看到里面又有很多子文件夹,这些子文件夹为具体的驱动或者平台相关,比如android,编译安卓版本时应该采用此目录内的文件。

 这里面的dummy文件夹比较特殊,是虚拟的意思,里面的函数是没有具体功能的,只是实现接口,可能是为编译通过?前面安装的两个音频库,分别对应alsa驱动和pulseaudio驱动,经过本人实测,没有这两个库,LoongArch平台编译的SDL在运行时无法通过音频模块的初始化。

四、cmake构建

        在编译文件的顶层目录新建CMakeLists.txt文件,不明白的查看“三、前期准备”中的第一张截图的CMakeLists.txt位置。参考的cmake文件内容:

#按自己的cmake版本填写,cmake版本不能太低,不然无法通过cmake构建过程
cmake_minimum_required(VERSION 3.13.0)

#设置输出目录,这里只设置了静态库的输出,因此一些test程序会提示无法链接编译库
#注意根据你新建的文件夹修改 00_bin
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/00_bin)

#编译SDL2,建议根据需要注释掉相应的库以加快编译速度,以及排除编译问题,比如编译SDL2就只启用
#SDL2相关内容,注释掉SDL_mixer等扩展库
add_subdirectory(SDL-release-2.26.5)  

在01_build目录中打开终端,执行 cmake ../   

经过一小段时间后,会提示cmake的生成的编译参数,如图:

如果遇到编译失败,一定要仔细检查各种开关/模块的打开状态(cmake文件位于SDL-release-2.26.5目录下,其他扩展库同理), 常见的编译工程是 shared library、static library和test,有时候test无法链接直接将状态设为OFF即可。

修改CMakeLists.txt里对应的参数后,一定要先删除01_build目录下的CMakeCache.txt文件,再重新执行cmake ../,不然参数还在缓存里没有更新,会导致错误。如果提示cmake版本不符合要求,修改对应的cmake文件的cmake_minimum_required(xxxx),版本改为当前系统版本即可。

cmake成功之后,直接输入make开始编译,如无意外,SDL的编译会很顺利,直接就编译成功。

接下来编译扩增库,这里以SDL_mixer为例:

修改顶层 CMakeLists.txt,增加以下命令:这里建议注释掉前面已经成功的SDL库,避免而外的编译时间及信息输出太多。

#编译SDL2_mixer
add_subdirectory(SDL_mixer-release-2.6.3)

运行cmake ../

毫无意外,提示了一个错误,表示找不到SDL的基础库,我们按提示在顶层cmake文件中,再编译SDL_mixer前增加SDL的库路径和include路径:

set(SDL2_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/00_bin)
set(SDL2_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/SDL-release-2.26.5/include)
#编译SDL2_mixer
add_subdirectory(SDL_mixer-release-2.6.3)

删除CMakeCache.txt,重新cmake ../,刚才错误的地方已经通过,但是出现了新的错误:

 这是告诉我们将启用 opus文件格式支持,但是没有找到opus的支持库,有三个解决方案:

1、不需要opus格式支持,直接进入SDL_mixer的cmake文件,进入到提示的369行:

 继续往上翻,找到进入分支:

 从文件首部搜索这个标记,将option( xxxxx  )的ON改为OFF。

删除CMakeCache.txt,重新执行cmake ../ 

2、自己下载opus库,并且在编译SDL_mixer之前,在cmake文件中为opusfile_LIBRARY和opusfile_INCLUDE_PATH变量提供值,可以参考之前提供的SDL基础库的方式。或者直接安装一个opusdev库,理论上应该能直接搜索到。

3、进入external目录,执行其中的download.sh脚本,将扩展依赖库下载下来(有些扩展库没有提供download脚本,自行从  Simple Directmedia Layer · GitHub 下载即可。然后修改顶层cmake文件:

#编译SDL2_mixer
add_subdirectory(SDL_mixer-release-2.6.3/external/opusfile)
add_subdirectory(SDL_mixer-release-2.6.3)

删除cmake缓存文件,包括*.cmake,重新执行cmake ../,这样就能识别到依赖库了,一直修改/更换子模块,直到SDL_mixer编译出来为止。

 建议非必要不要增加额外扩展库,编译起来各种依赖,各种要修改。

耐心的修改/编译完成所有需要的库即可:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值