当库使用模板(泛型)时,是否可以使用 Rust 的 C++ 库?
Is it possible to use a C++ library from Rust when the library uses templates (generics)?
当库(例如 Boost)使用模板(泛型)时,是否可以使用来自 Rust 的 C++ 库?
可以,但可能不实用。
D 编程语言是为数不多的提供某种程度的 C++ 互操作性的语言之一;您可以在 dlang.
上阅读更多相关信息
注意模板部分的限制:
Note that all instantiations used in D code must be provided by linking to C++ object code or shared libraries containing the instantiations.
这实际上意味着您必须使用 C++ 代码来实例化具有正确类型的模板,然后 D 编译器将 link 反对这些实例化。
你可以对 Rust 做同样的事情。如果没有编译器支持,这意味着手动修改名称。在 FFI 部分,您会找到 link attribute:
#[link(name = "snappy")]
extern {
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
}
告诉编译器哪个 linked 库将提供符号,您还将支持 various calling conventions and the no_mangle attribute.
您可能需要根据需要应用 #[allow(non_snake_case)]
。
Servo 使用bindgen 为 C 和 C++ 代码生成 Rust 绑定;我不清楚 C++ 支持的级别,并且有点怀疑它是否可以处理模板。
当库(例如 Boost)使用模板(泛型)时,是否可以使用来自 Rust 的 C++ 库?
可以,但可能不实用。
D 编程语言是为数不多的提供某种程度的 C++ 互操作性的语言之一;您可以在 dlang.
上阅读更多相关信息注意模板部分的限制:
Note that all instantiations used in D code must be provided by linking to C++ object code or shared libraries containing the instantiations.
这实际上意味着您必须使用 C++ 代码来实例化具有正确类型的模板,然后 D 编译器将 link 反对这些实例化。
你可以对 Rust 做同样的事情。如果没有编译器支持,这意味着手动修改名称。在 FFI 部分,您会找到 link attribute:
#[link(name = "snappy")]
extern {
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
}
告诉编译器哪个 linked 库将提供符号,您还将支持 various calling conventions and the no_mangle attribute.
您可能需要根据需要应用 #[allow(non_snake_case)]
。
Servo 使用bindgen 为 C 和 C++ 代码生成 Rust 绑定;我不清楚 C++ 支持的级别,并且有点怀疑它是否可以处理模板。