环境准备
Current installation options:
default host triple: x86_64-pc-windows-msvc
default toolchain: stable
profile: default
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>2
I'm going to ask you the value of each of these installation options.
You may simply press the Enter key to leave unchanged.
Default host triple?
x86_64-pc-windows-gnu
Default toolchain? (stable/beta/nightly/none)
stable
Profile (which tools and data to install)? (minimal/default/complete)
default
Modify PATH variable? (y/n)
y
[build]
target="x86_64-pc-windows-gnu"
编写Rust库
- 创建工程
cargo new mylib --lib
- 在Cargo.toml中添加
[dependencies]
libc = "*"
[lib]
crate-type = ["staticlib"] #静态库
#非常重要:必须要对panic进行标注,否则会出现问题
[profile.release]
panic="abort"
#非常重要:必须要对panic进行标注,否则会出现问题
[profile.dev]
panic="abort"
- 编写rust源码
//src/lib.rs
extern crate libc;
use libc::uint32_t;
#[no_mangle]
pub extern "C" fn addition(a: uint32_t, b: uint32_t) -> uint32_t {
a + b
}
- 编译
#debug版本,采用如下命令编译
cargo build
#release版本,采用如下命令编译
cargo build --release
- 生成的库文件
debug版本的生成目录在:mylib/target/x86_64-pc-windows-gnu/debug
release版本的生成目录为:mylib/target/x86_64-pc-windows-gnu/release
编写c++调用Rust库
- 编写源码
//文件名:caller.cpp
#include <stdio.h>
#include <stdint.h>
extern "C" {
uint32_t
addition(uint32_t, uint32_t);
}
int main(void) {
uint32_t sum = addition(1, 2);
printf("%u\n", sum);
return 0;
}
- 编译c++
x86_64-w64-mingw32-g++ -c -o win_cpp_caller.o caller.cpp
编译exe文件
- 编译调用debug版本rust库
D:/tools/mingw64/bin/x86_64-w64-mingw32-g++ -static win_cpp_caller.o -o win_cpp_caller -L./mylib/target/x86_64-pc-windows-gnu/debug -lmylib -ladvapi32 -lws2_32 -luserenv
- 编译调用release版本rust库
D:/tools/mingw64/bin/x86_64-w64-mingw32-g++ -static win_cpp_caller.o -o win_cpp_caller -L./mylib/target/x86_64-pc-windows-gnu/release -lmylib -ladvapi32 -lws2_32 -luserenv
说明:我的mingw64装在D:/tools下,编译时将目录缓存自己的目录即可,另外,编译时需要加上advapi32 ws2_32 userenv三个库。
最终生成win_cpp_caller.exe文件。
总结
本文的例子演示的是64位的例子,32位的例子在网上可以找到相应的资料。在整个过程中,非常需要注意的是需要在Cargo.toml文件中添加panic="abort"。
当然,网上也有使用msvc编译的例子,不过貌似也比较麻烦,不出意外的话可能也有坑。