我有一个lib项目,在单独的文件中有多个分别名为one
和two
的模块。每个模块都有一个名为run
的功能:
mod one {
pub fn run() {
println!("One");
}
}
mod two {
pub fn run() {
println!("Two");
}
}
fn main() {
one::run();
two::run();
}
我想将每个文件/函数编译为WebAssembly,然后能够加载它们并调用函数run()
。
我相信我必须添加#[no_mangle]
指令并将其标记为extern "C"
函数。当我这样做时,尽管模块结构不同,但run
函数上却存在名称冲突。
这是无法编译的修改版本:
mod one {
#[no_mangle]
pub extern "C" fn run() {
println!("One");
}
}
mod two {
#[no_mangle]
pub extern "C" fn run() {
println!("Two");
}
}
fn main() {
one::run();
two::run();
}
是否可以在项目中具有多个模块,每个模块具有相同名称的功能,这样我就可以将具有功能的文件编译为WebAssembly,并保留功能名称?
答案 0 :(得分:2)
否,您不能在全局名称空间中为多个事物赋予相同的名称。这就是名称和名称空间的定义。您需要将它们导出为两个不同的名称。
我更喜欢使用一个可以导出内容的位置,这样可以更轻松地查看和防止冲突。此外,在与您的库链接的所有库中,您的符号应该唯一。这就是为什么大多数高质量C项目在每种公共方法中都使用库名的原因。
mod one {
pub fn run() {
println!("One");
}
}
mod two {
pub fn run() {
println!("Two");
}
}
#[no_mangle]
pub extern "C" fn mylib_one_run() {
one::run()
}
#[no_mangle]
pub extern "C" fn mylib_two_run() {
two::run()
}
fn main() {
one::run();
two::run();
}
另请参阅: