#
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