You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri+NextJS中调用Rust函数失败的编译错误排查

解决Tauri+NextJS录屏应用编译错误

错误1:找不到__cmd__start_capture和__cmd__stop_capture函数

这是Tauri命令未正确标记或注册导致的,按以下步骤修复:

  • 在screen_capture.rs中,给start_capture和stop_capture函数添加#[tauri::command]宏,同时用pub修饰确保函数可被外部访问
  • 在main.rs中,将这两个命令注册到Tauri应用的调用处理器中

示例代码

screen_capture.rs

use tauri::State;
use std::sync::Mutex;
use windows_capture::{WindowsCaptureHandler, WindowsCaptureSettings};
use once_cell::sync::Lazy;

// 用Mutex管理全局录屏状态
static CAPTURE_STATE: Lazy<Mutex<Option<WindowsCaptureHandler>>> = Lazy::new(|| Mutex::new(None));

#[tauri::command]
pub fn start_capture() -> Result<(), String> {
    // 初始化录屏配置
    let settings = WindowsCaptureSettings::new(/* 填入你的录屏参数 */)
        .map_err(|e| format!("创建录屏配置失败: {}", e))?;
    // 启动录屏
    let handler = WindowsCaptureHandler::new(settings)
        .map_err(|e| format!("启动录屏失败: {}", e))?;
    
    // 更新全局状态
    let mut state = CAPTURE_STATE.lock().map_err(|e| format!("锁定状态失败: {}", e))?;
    *state = Some(handler);
    Ok(())
}

#[tauri::command]
pub fn stop_capture() -> Result<(), String> {
    // 清空录屏状态以停止捕获
    let mut state = CAPTURE_STATE.lock().map_err(|e| format!("锁定状态失败: {}", e))?;
    *state = None;
    Ok(())
}

main.rs

mod screen_capture;

fn main() {
    tauri::Builder::default()
        // 注册screen_capture模块的命令
        .invoke_handler(tauri::generate_handler![
            screen_capture::start_capture,
            screen_capture::stop_capture
        ])
        .run(tauri::generate_context!())
        .expect("运行Tauri应用出错");
}

错误2:返回值不符合Result类型要求

所有标记#[tauri::command]的函数必须返回Result<T, E>类型,其中E需实现Into<tauri::Error>:

  • 禁止直接返回裸值或未包装的错误,统一用Ok(成功值)和Err(错误描述字符串)包装返回结果
  • 若使用自定义错误类型,需手动实现Into<tauri::Error> trait

错误写法修正

错误示例:

#[tauri::command]
pub fn start_capture() {
    // 无返回值,不符合要求
}

正确示例:

#[tauri::command]
pub fn start_capture() -> Result<(), String> {
    // 业务逻辑处理
    Ok(())
}

错误3:未使用的导入警告

  • 直接删除代码中未被引用的导入语句(比如use windows_capture::SomeUnusedStruct;)
  • 若需暂时保留未使用的导入,可添加#[allow(unused_imports)]属性屏蔽警告

示例

#[allow(unused_imports)]
use once_cell::sync::OnceCell; // 未使用的导入,添加属性屏蔽警告

内容的提问来源于stack exchange,提问作者themujahidkhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:08:16