【发布时间】:2019-05-04 04:02:27
【问题描述】:
我正在尝试开始使用 Rust FFI,所以我去了the nomicon's documentation on FFI 并尝试复制“外部调用约定”示例。
我编写了一段简单的代码,只是复制粘贴示例并尝试使用声明的函数:
extern crate libc;
#[cfg(all(target_os = "win32", target_arch = "x86"))]
#[link(name = "kernel32")]
#[allow(non_snake_case)]
extern "stdcall" {
fn SetEnvironmentVariableA(n: *const u8, v: *const u8) -> libc::c_int;
}
fn main() {
println!("Enter main");
unsafe {
let ret = SetEnvironmentVariableA("SOME_NEW_ENV_VAR\0", "NEW_ENV_VAR_VAL\0");
println!("ret: {}", ret);
}
println!("Exit main");
}
这并没有真正做任何有用的事情,我只是想看看我是否可以链接并调用一个函数而不会爆炸。
我从编译器得到这个错误:
error[E0425]: cannot find function `SetEnvironmentVariableA` in this scope
--> src\main.rs:13:19
|
13 | let ret = SetEnvironmentVariableA("SOME_NEW_ENV_VAR\0","NEW_ENV_VAR_VAL\0");
| ^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
示例是否已过时?我错过了什么明显的东西吗?看来无论如何,我声明的SetEnvironmentVariableA 应该在范围内。
我知道 winapi crate,但我正在尝试学习 Rust FFI;使用解决问题的现有板条箱将无法达到目的。
【问题讨论】:
-
你确定你在
#[cfg(all(target_os = "win32", target_arch = "x86"))]上编译吗? -
我在 windows 上,所以 win32 和 x86 应该生成兼容的二进制文件。