我的main.rs
看起来像
// #[link(name = "lib")]
extern "C" {
fn hello();
}
fn main() {
unsafe {
hello();
}
}
和lib.rs
:
#[no_mangle]
pub fn hello() {
println!("Hello, World!");
}
我用lib.rs
编译了rustc --crate-type=cdylib lib.rs -o lib.so
如何将lib.so
链接到rustc main.rs
命令?
你需要匹配ABI。使用extern "C"
块时,需要使用相同的ABI声明函数。
使用平台的约定命名动态库。在macOS上使用.dylib
,在Windows上使用.lib
,在Linux上使用.so
。如果您不提供rustc
选项,-o
将自动为您执行此操作。
构建动态库之后,需要将其添加到编译器的链接器选项中。 rustc --help
有各种编译器选项的列表。 -L
在搜索路径中添加了一个目录,-l
链接到特定的库。
礼拜.人生
#[no_mangle]
pub extern "C" fn hello() {
println!("Hello, World!");
}
卖弄.人生
extern "C" {
fn hello();
}
fn main() {
unsafe {
hello();
}
}
编译并执行:
$ rustc --crate-type=cdylib lib.rs
$ rustc main.rs -L . -l lib
$ ./main
Hello, World!
当我在macOS上时,我使用otool
来表明它确实是动态链接的:
$ otool -L main
main:
liblib.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
也可以看看:
为了完整性,这里是板条箱的“正常”链接:
礼拜.人生
pub fn hello() {
println!("Hello, World!");
}
卖弄.人生
fn main() {
lib::hello();
}
$ rustc --crate-type=rlib lib.rs
$ rustc main.rs --extern lib=liblib.rlib
$ ./main
Hello, World!
$ otool -L main
main:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)