我有一个包含两个文件的项目:
src/lib.rs
src/rle.rs
rle.rs
包含以下内容(以及更多内容):
extern crate libc;
#[derive(Debug, PartialEq)]
pub struct Rle {
pub lengths: Vec<i32>,
pub values: Vec<i32>,
}
#[no_mangle]
pub extern "C" fn rle_new(blablabla...)
lib.rs
如下所示:
mod rle;
use rle::rle_new;
// blablabla
当我在Python中加载库时,我收到错误:
Traceback (most recent call last):
File "compact_ranges.py", line 19, in <module>
lib.rle_new.restype = POINTER(RleS)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x7f94ca700370, rle_new): symbol not found
看起来Rust理解这一点(聪明,聪明),因为我的linter说:
17 1 warning function rle_new is marked #[no_mangle], but not exported, #[warn(private_no_mangle_fns)] on by default (rust-cargo)
如何修复此问题并使我的函数rle_new
可从target / debug / libranges.dylib文件中获取?
我的crate-type
中的Cargo.toml
为["dylib"]
答案 0 :(得分:15)
Rust的理念是偏好显式而非隐式。
Rust只会导出可从根包中公开访问的符号。这使得检查包的公共接口非常容易,而无需遍历所有文件:只需按照根目录中的rle_new
进行操作。
在您的情况下,任何有权访问rle
模块的人(例如兄弟模块)都可以公开访问符号rle
,但pub use rle::rle_new;
模块本身无法公开访问根箱子。
最简单的解决方案是有选择地导出此符号:
{{1}}