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
相关产品推荐
相关产品推荐

