如何 link 只使用 rustc 而不是 cargo 的动态 Rust 库?
How to link a dynamic Rust library using only rustc and not cargo?
我的main.rs
长得像
// #[link(name = "lib")]
extern "C" {
fn hello();
}
fn main() {
unsafe {
hello();
}
}
和lib.rs
:
#[no_mangle]
pub fn hello() {
println!("Hello, World!");
}
我使用 rustc --crate-type=cdylib lib.rs -o lib.so
编译了 lib.rs
如何 link lib.so
到 rustc main.rs
命令?
您需要匹配 ABI。当您使用 extern "C"
块时,您需要使用相同的 ABI 声明您的函数。
使用平台的约定命名您的动态库。在 macOS 上使用 .dylib
,在 Windows 上使用 .lib
,在 Linux 上使用 .so
。如果您不提供 -o
选项,rustc
将自动为您执行此操作。
构建动态库后,需要将其添加到编译器的链接器选项中。 rustc --help
有各种编译器选项的列表。 -L
将目录添加到搜索路径并 -l
链接到特定库。
lib.rs
#[no_mangle]
pub extern "C" fn hello() {
println!("Hello, World!");
}
main.rs
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)
另请参阅:
- How do I specify the linker path in Rust?
为了完整起见,这里是 "normal" 板条箱的链接:
lib.rs
pub fn hello() {
println!("Hello, World!");
}
main.rs
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)
我的main.rs
长得像
// #[link(name = "lib")]
extern "C" {
fn hello();
}
fn main() {
unsafe {
hello();
}
}
和lib.rs
:
#[no_mangle]
pub fn hello() {
println!("Hello, World!");
}
我使用 rustc --crate-type=cdylib lib.rs -o lib.so
lib.rs
如何 link lib.so
到 rustc main.rs
命令?
您需要匹配 ABI。当您使用 extern "C"
块时,您需要使用相同的 ABI 声明您的函数。
使用平台的约定命名您的动态库。在 macOS 上使用 .dylib
,在 Windows 上使用 .lib
,在 Linux 上使用 .so
。如果您不提供 -o
选项,rustc
将自动为您执行此操作。
构建动态库后,需要将其添加到编译器的链接器选项中。 rustc --help
有各种编译器选项的列表。 -L
将目录添加到搜索路径并 -l
链接到特定库。
lib.rs
#[no_mangle]
pub extern "C" fn hello() {
println!("Hello, World!");
}
main.rs
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)
另请参阅:
- How do I specify the linker path in Rust?
为了完整起见,这里是 "normal" 板条箱的链接:
lib.rs
pub fn hello() {
println!("Hello, World!");
}
main.rs
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)