Featured image of post 使用 cmake 构造 raylib

使用 cmake 构造 raylib

通过 cmake 来构建 raylib 和其相关的组件

# raylib 概述

raylib 是一个简单易用的库,是我们可以较为简单的享受游戏编程。除此之为 raylib 的作者还提供其他的扩展组件。 https://www.raylib.com/ 是 raylib 的官方网站,可以通过此网站获取更加详细的信息

# 本博客的目的

作者也是在机缘巧合的情况下了解到该库,经过一番体验下来,便突发奇想能否通过cmake 将raylib 作者提供的模块与 raylib 整合到一起,经过一段时间的研究终于完成简易的整合,该博客将记录整合的过程和遇到的问题

# 开始

# 环境准备

1.cmake https://cmake.org/ 下载最新版即可

2.mingw https://github.com/niXman/mingw-builds-binaries/releases
根据自己的操作系统选择对应的版本,当然你也可以选择其他的构建工具 win用户可选 posix-seh-ucrt-rt 的版本,其他版本的区别请自行查询,如果是从其他渠道下载的构建工具请一定要检查 gcc 的版本是否过低,之前作者就因 gcc 过低导致的报错,排了好一会的错误 windows 下的指令为 gcc -v

3.配置环境变量
将 cmake 和 mingw 的 bin 路径配置到系统的环境变量中,配置环境的变量的方法请自行查找

4.额外操作
此处建议 windows 用户将 mingw32-make 复制并重命名为 make,如果你的电脑上没有安装过 visual studio 可能会不存在 msvc 等其他编译器导致报错。

# 文件结构

创建一个项目文件夹,在此文件夹中建议为如下的结构

  • asset 资源文件夹
  • build 构建文件夹
  • includ 存放头文件
  • lib 存放第三方库
  • src 存放源文件
  • CMakeLists.txt cmake 文件

# 编写 CMakeLists.txt

# 外层 CMakeLists.txt

即文件目录下最外层的 CMakeLists.txt 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#指定 cmake 最低版本
cmake_minimum_required(VERSION 3.20)

#指定项目名称
project(sol)
#指定C++标准
set(CMAKE_CXX_STANDARD 20)

# Generate compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

#添加子目录
add_subdirectory("src")

其中指定 cmake 最低版本中填写的版本不得高于当前使用的版本

# src 下的 CMakeLists.txt

首先先创建一个测试 cpp 文件 并在 CMakeLists.txt 中添加如下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#设定参与编译的文件集合
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)

#设定可执行文件的输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

#设定头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)


#设定库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)

${PROJECT_SOURCE_DIR} 为项目的根目录 上方的配置定义了参与编译的文件集合、头文件路径和库路径,并设定的可执行文件输出指根目录下的bin文件夹中(没有构建时会自动创建)

# raylib 相关配置

根据官方项目中 CMakeLists.txt 的示例我做了如下整合与修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
set(RAYLIB_VERSION 5.5)
find_package(raylib ${RAYLIB_VERSION} QUIET) 
if (NOT raylib_FOUND) 
  include(FetchContent)
  FetchContent_Declare(
    raylib
    DOWNLOAD_EXTRACT_TIMESTAMP OFF
    URL https://github.com/raysan5/raylib/archive/refs/tags/${RAYLIB_VERSION}.tar.gz
  )
  FetchContent_GetProperties(raylib)
  if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
    set(FETCHCONTENT_QUIET NO)
    FetchContent_MakeAvailable(raylib)
    set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) 
  endif()
endif()

set(RAYGUI_VERSION 4.0)
find_package(raygui ${RAYGUI_VERSION} QUIET) # QUIET or REQUIRED
if (NOT raygui_FOUND) # If there's none, fetch and build raylib
  include(FetchContent)
  FetchContent_Declare(
    raygui
    DOWNLOAD_EXTRACT_TIMESTAMP OFF
    URL https://github.com/raysan5/raygui/archive/refs/heads/master.zip
  )
  FetchContent_GetProperties(raygui)
  if (NOT raygui_POPULATED) # Have we downloaded raylib yet?
    set(FETCHCONTENT_QUIET NO)
    FetchContent_MakeAvailable(raygui)
    set(BUILD_RAYGUI_EXAMPLES OFF CACHE BOOL "" FORCE) 
    add_subdirectory(${raygui_SOURCE_DIR}/projects/CMake ${raygui_BINARY_DIR})
  endif()
endif()

set(RRES_VERSION 1.2.0)
find_package(rres ${RRES_VERSION} QUIET) # QUIET or REQUIRED
if (NOT rres_FOUND) # If there's none, fetch and build raylib
  include(FetchContent)
  FetchContent_Declare(
    rres
    DOWNLOAD_EXTRACT_TIMESTAMP OFF
    URL https://github.com/raysan5/rres/archive/refs/heads/master.zip
  )
  FetchContent_GetProperties(rres)
  if (NOT rres_POPULATED) # Have we downloaded raylib yet?
    set(FETCHCONTENT_QUIET NO)
    FetchContent_MakeAvailable(rres)
    set(BUILD_RRES_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
    add_subdirectory(${rres_SOURCE_DIR}/projects/CMake ${rres_BINARY_DIR})
  endif()
endif()

option(SUPPORT_FILEFORMAT_WAV "WAV Support" TRUE)
option(SUPPORT_FILEFORMAT_OGG "OGG Support" TRUE)
option(SUPPORT_FILEFORMAT_MP3 "MP3 Support" TRUE)
option(SUPPORT_FILEFORMAT_QOA "QOA Support" TRUE)
option(SUPPORT_FILEFORMAT_FLAC "FLAC Support" TRUE)
option(SUPPORT_FILEFORMAT_XM "XM Support" TRUE)
option(SUPPORT_FILEFORMAT_MOD "MOD Support" TRUE)

file(COPY ${PROJECT_SOURCE_DIR}/include/rres/rres-raylib.h DESTINATION ${rres_SOURCE_DIR}/src)

# Our Project
add_executable(${PROJECT_NAME} ${SRC})
#set(raylib_VERBOSE 1)
target_link_libraries(${PROJECT_NAME} raylib raygui rres)

# Web Configurations
if (${PLATFORM} STREQUAL "Web")
    set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".html") 
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY -s GL_ENABLE_GET_PROC_ADDRESS=1")
endif()

# Checks if OSX and links appropriate frameworks (Only required on MacOS)
if (APPLE)
    target_link_libraries(${PROJECT_NAME} "-framework IOKit")
    target_link_libraries(${PROJECT_NAME} "-framework Cocoa")
    target_link_libraries(${PROJECT_NAME} "-framework OpenGL")
endif()

关键在于 find_package 的部分。如果没有找到对应的包,将会自动代码中配置的包,其中raudio 已经被作者整合到 raylib 中 ,故只需要下载 raylib、raygui和rres即可。

# 编写测试代码

注意如果使用的 cpp 代码需要对 rres-raylib.h 头文件做出一定的修改否则编译报错 修改如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//line 567
crypto_argon2_inputs inputs = {
.pass = (const uint8_t *)rresGetCipherPassword(), // User password
.salt = salt, // Salt for the password
.pass_size = (uint32_t)strlen(rresGetCipherPassword()), // Password length
.salt_size = 16|
};

//line 641
crypto_argon2_inputs inputs = {
.pass = (const uint8_t *)rresGetCipherPassword(), // User password
.salt = salt, // Salt for the password
.pass_size = (uint32_t)strlen(rresGetCipherPassword()), // Password length
.salt_size = 16|
};

//line 669
int decryptResult = crypto_aead_unlock(decryptedData, mac, key, nonce, NULL, 0, (const u8 *)chunk->data.raw, (chunk->info.packedSize - 16 - 24 - 16));

可能是源代码是用c编写的作者,我已经在githut提交了pull request。作者已经同意合并,新版本的rres不会在出现此问题

# build

最后在根目录下创建 build 文件夹,在 build 文件夹下启动命令行 ,按顺序输入如下指令(./ 根据你项目实际路径而定)

1
2
cmake ./
cmake --build ./

-G"Unix Makefiles" 如果是Windows 操作系统下且需要 makefiles 需要加上该语句。运行中可能会受网络影响导致下载失败多试几次即可。如果一切正常应该可以在根目录下看到 bin 文件夹且里面有一个可执行文件,如果可执行文件可正常运行就大功告成了。

#

如果您嫌麻烦可以直接从github 下载我项目 https://github.com/IyuMashiro/raylib_raygui_rres_template

使用 Hugo 构建
主题 StackJimmy 设计