rust - SDL2如何安装和使用 "gfx"功能

标签 rust sdl sdl-2 gfx

我使用 SLD2 箱来创建一个简单的物理模拟/引擎。我想使用 "gfx" 功能来获取帧速率和绘图基元。我知道我需要将 "SDL2_gfx.lib" 文件包含在 C:\Users\{您的用户名}\.rustup\toolchains\{当前工具链}\lib\ruSTLib\{当前工具链}\lib“SLD2.lib” 安装完全相同。问题是我找不到所需的 "SDL2_gfx.lib" 文件。 The repository引导我到 this gfx download source 。但是,我似乎在该文件夹中找不到任何 ".lib" 文件。我尝试使用 Visual Studio Code 构建 "SLD2_gfx" 解决方案(在所述文件夹中找到),以获得 ".lib" 文件,但由于缺少头文件而失败。我不熟悉 C/C++ 或 Visual Studio Code,所以我也无法修复该解决方案。如何获取"SDL2_gfx.lib" 文件和/或关联的".dll" 文件?

这是我到目前为止得到的代码:

use sdl2::{pixels::Color, event::Event, keyboard::Keycode, rect::{Rect, Point}}; 
use sdl2::gfx::*;

const WIDTH: u32 = 1000; 
const HEIGHT: u32 = 700;

const RECT_SIZE: u32 = 30;

pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();

    let window = video_subsystem.window("Physics Sim", WIDTH, HEIGHT)
        .position_centered()
        .build()
        .unwrap();

    let width = window.size().0;
    let height = window.size().1;

    let mut canvas = window.into_canvas().build().unwrap();

    canvas.set_draw_color(Color::RGB(0, 0, 0));
    canvas.clear();
    canvas.present();
    let mut event_pump = sdl_context.event_pump().unwrap();
    let mut i = 0;

    let mut rect = Rect::from_center(Point::new(width as i32 / 4, height as i32 / 4), RECT_SIZE, RECT_SIZE);
    let rect_border_width = 1;

    'running: loop {
        i = (i + 1) % 255;

        canvas.set_draw_color(Color::RGB(0, 0, 0));
        canvas.clear();

        // Inside of rect
        canvas.set_draw_color(Color::RGB(i, 64, 255 - i));
        canvas.fill_rect(rect).unwrap();
        
        // Border of rect
        canvas.set_draw_color(Color::RGB(255, 255, 255));
        canvas.draw_rect(rect).unwrap();

        for event in event_pump.poll_iter() {
            match event {
                Event::Quit {..} |
                Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
                    break 'running
                },
                _ => {}
            }
        }
        // game loop
        let rect_y = rect.y();
        if rect_y + rect_border_width + RECT_SIZE as i32 <= height as i32 {
            rect.set_y(rect_y);
        }

        canvas.present();
        ::std::thread::sleep(std::time::Duration::new(0, 1_000_000_000u32 / 60));
    } }

Cargo.toml:

[dependencies]
sdl2 = {version = "0.35.2", default-features = false, features = ["gfx"]}

我收到的错误:

note: LINK : fatal error LNK1181: cannot open input file 'SDL2_gfx.lib'

最佳答案

我按照 README.md 文件中的 vcpkg 部分取得了成功:https://github.com/Rust-SDL2/rust-sdl2#windows-msvc-with-vcpkg并且那里的说明更清晰一些。

vcpkg 是一个包管理器,可帮助管理 C 和 C++ 库。我不需要直接安装它,而是通过一个名为 cargo-vcpkg 的 rust Cargo 命令来安装,该命令根据需要从 github 存储库克隆并构建 vcpkg

我的 Cargo.toml 文件如下所示(注意“use-vcpkg”功能和 vcpkg 的具体说明,例如 github 存储库位置和要查看的 git rev(501db0f 是最近的版本)发布版本)):

[package]
name = "sdl2-gfx-game"
version = "0.1.0"
edition = "2021"

[dependencies.sdl2]
version = "0.35.2"
default-features = false
features = ["static-link", "use-vcpkg", "gfx"]

[package.metadata.vcpkg]
dependencies = ["sdl2", "sdl2-gfx"]
git = "https://github.com/microsoft/vcpkg"
rev = "501db0f"

[package.metadata.vcpkg.target]
x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }

之后就是运行的问题了

cargo install cargo-vcpkg

此安装Cargo-vcpkg是一项一次性任务。

那么,

cargo vcpkg build

当要包含任何新的 C 或 C++ 库(例如 sdl2 ttf)时,需要重新运行。这通常需要一些时间。

最后,

cargo build

这将像往常一样构建您的项目,并安装并运行 sdl2-gfx 软件包。

关于rust - SDL2如何安装和使用 "gfx"功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75781517/

相关文章:

codeblocks - 对 SDL_Init ( CodeBlocks ) 的 undefined reference

hashmap - 如何创建 HashMap 文字?

rust - 借用检查器尝试将函数指针作为参数传递的问题

c++ - SDL 和 g++ 总是产生错误?

c++ - SDL/C++ : How to make this function short(er)?

c++ - Mix_PlayMusic 导致内存损坏

c++ - 在另一台电脑上执行程序时加载 SDL2 共享库时出错

rust - 如何引用可变切片

rust - 与具体实现类型相比,使用关联类型有什么优势吗?

c - 使用 MingW 编译 SDL 项目时 undefined reference (不是 WinMain 错误)