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

Rust代码无法编译为DLL,依赖导入报错求助

Rust编译DLL时依赖未解析且无法生成DLL的问题

问题描述

我是Rust新手,尝试将代码编译为DLL时遇到两个问题:

  • 已在Cargo.toml中声明rand和regex依赖,但编译时仍出现这两个 crate 未解析的错误
  • 执行cargo build --release --lib后未生成DLL文件

相关代码

sus_fns.rs

use std::fs;
use rand::Rng;
use regex::Regex;

pub fn generate_memes_text(chat_id: &str) -> String {
    let filename = format!("../all_databases/stytsko_folder_id_{}_v/stytsko_db_mod=one-line_id_{}_v.txt", chat_id, chat_id);
    let _contents = fs::read_to_string(&filename).expect("Unable to read file");

    fn extract_words_from_buffer(buffer: &str) -> Vec<&str> {
        let re = Regex::new(r"[\s\n]+").unwrap();
        re.split(buffer.trim()).collect()
    }

    fn build_markov_chain<'a>(words: &'a [&'a str]) -> std::collections::HashMap<&'a str, Vec<&'a str>> {
        let mut markov_chain = std::collections::HashMap::new();

        for i in 0..words.len()-1 {
            let current_word = words[i];
            let next_word = words[i+1];

            markov_chain.entry(current_word).or_insert(Vec::new()).push(next_word);
        }

        markov_chain
    }

    fn generate_markov_expression(markov_chain: &std::collections::HashMap<&str, Vec<&str>>, num_words: usize) -> String {
        let mut expression = String::new();
        let mut current_word = get_random_word(markov_chain.keys().cloned().collect());

        let mut num_words_remaining = num_words;
        while num_words_remaining > 0 {
            expression.push_str(current_word);
            expression.push(' ');

            let empty_vec = Vec::new();
            let next_words = markov_chain.get(current_word).unwrap_or(&empty_vec).to_vec();
            if next_words.is_empty() {
                break;
            }

            current_word = get_random_word(next_words.iter().cloned().collect());
            num_words_remaining -= 1;
        }

        expression.trim().to_string()
    }

    fn get_random_word(words: Vec<&str>) -> &str {
        let mut rng = rand::thread_rng();
        let random_index = rng.gen_range(0..words.len());
        words[random_index]
    }

    fn generate_message_from_file(filename: &str, num_words: usize) -> String {
        let contents = fs::read_to_string(filename).expect("Unable to read file");
        let words = extract_words_from_buffer(&contents);

        let expression = if words.len() > num_words {
            let markov_chain = build_markov_chain(&words);
            generate_markov_expression(&markov_chain, num_words)
        } else if words.len() == num_words {
            words.join(" ")
        } else {
            words[..words.len()-1].join(" ")
        };

        expression
    }

    let num_words = rand::thread_rng().gen_range(1..=5);
    let selected_words = generate_message_from_file(&filename.clone(), num_words);

    selected_words
}

lib.rs

mod sys_fns;

#[no_mangle]
pub extern "C" fn generate_memes_text(chat_id: *const i8) -> *mut i8 {
    use std::ffi::CString;
    use std::ffi::CStr;
    use std::str;

    let chat_id_str = unsafe { CStr::from_ptr(chat_id).to_bytes() };
    let chat_id_string = str::from_utf8(chat_id_str).unwrap();
    let selected_words = sys_fns::generate_memes_text(chat_id_string);
    let result = CString::new(selected_words).unwrap().into_raw();

    result
}

Cargo.toml

[package]
name = "myproject"
version = "0.1.0"
edition = "2021"

[dependencies]
rand = "0.8"
regex = "1.4"

错误信息

C:\MeFolder\testing python with rust>rustc --crate-type cdylib myproject/src/lib.rs
error[E0432]: unresolved import `rand`
 --> myproject/src\sys_fns.rs:2:5
  |
2 | use rand::Rng;
  |     ^^^^ maybe a missing crate `rand`?
  |
  = help: consider adding `extern crate rand` to use the `rand` crate

error[E0432]: unresolved import `regex`
 --> myproject/src\sys_fns.rs:3:5
  |
3 | use regex::Regex;
  |     ^^^^^ maybe a missing crate `regex`?
  |
  = help: consider adding `extern crate regex` to use the `regex` crate

error[E0433]: failed to resolve: use of undeclared crate or module `rand`
  --> myproject/src\sys_fns.rs:71:21
   |
71 |     let num_words = rand::thread_rng().gen_range(1..=5);
   |                     ^^^^ use of undeclared crate or module `rand`

error[E0433]: failed to resolve: use of undeclared crate or module `rand`
  --> myproject/src\sys_fns.rs:50:23
   |
50 |         let mut rng = rand::thread_rng();
   |                       ^^^^ use of undeclared crate or module `rand`

error: aborting due to 4 previous errors

Some errors have detailed explanations: E0432, E0433.
For more information about an error, try `rustc --explain E0432`.

注:sus_fns.rs代码由Perplexity.ai从Python翻译而来,已尝试cargo update、cargo build等命令,问题依旧。


解决方案

1. 修复模块导入错误

lib.rs中声明的模块是sys_fns,但实际文件名是sus_fns.rs,两者不匹配导致依赖无法被正确识别。解决方法二选一:

  • 将sus_fns.rs重命名为sys_fns.rs
  • 修改lib.rs中的模块声明为mod sus_fns;,并将调用代码改为sus_fns::generate_memes_text(chat_id_string);

2. 配置Cargo生成DLL

在Cargo.toml中添加[lib]段,指定 crate 类型为动态链接库:

[lib]
crate-type = ["cdylib"]

3. 使用正确的构建命令

不要直接用rustc编译,因为它不会自动处理Cargo依赖。执行以下命令构建:

cargo build --release

生成的DLL文件会位于target/release/myproject.dll(Windows系统)。

额外注意事项

  • Rust对文件名大小写敏感,确保模块声明与文件名完全一致
  • 避免直接使用rustc编译依赖外部 crate 的项目,Cargo会自动处理依赖的下载、编译和链接
  • sus_fns.rs中存在未使用的_contents变量,可删除或使用以消除编译警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:44:57