- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开始使用 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;使用解决问题的现有 crate 将达不到目的。
最佳答案
Stargateur 的评论是正确的方向。删除以下行解决了问题:
#[cfg(all(target_os = "win32", target_arch = "x86"))]
cfg
attribute在本教程的“外部调用约定”部分中使用过,所以我认为它在某种程度上是让链接和调用约定起作用的魔法的一部分。 cfg
根本不是这样工作的。仅文档的 URL 就解释了为什么我收到“找不到函数”错误:“条件编译”。
我能够将这个例子扩展成一种 Hello World :
#[link(name = "kernel32")]
#[allow(non_snake_case)]
extern "stdcall" {
fn SetEnvironmentVariableA(n: *const u8, v: *const u8) -> i32;
fn GetEnvironmentVariableA(n: *const u8, v: *mut u8, s : u32) -> i32;
}
fn main() {
println!("Enter main");
unsafe {
let ret = SetEnvironmentVariableA("HELLO_WORLD_VAR\0".as_ptr(),"hellow world!\0".as_ptr());
println!("ret: {}", ret);
let mut dummy : u8 = 0;
let ret1 = GetEnvironmentVariableA("HELLO_WORLD_VAR\0".as_ptr(), &mut dummy, 0);
println!("ret1: {}", ret1);
if ret1 > 0 {
let mut read = vec![0; ret1 as usize];
let ret2 = GetEnvironmentVariableA("HELLO_WORLD_VAR\0".as_ptr(),read.as_mut_ptr(), ret1 as u32);
let read_str = String::from_utf8(read).unwrap();
println!("ret2: {}", ret2);
println!("read_str: {}", read_str);
println!("read_str.len(): {}", read_str.len());
}
}
println!("Exit main");
}
关于rust - 尝试遵循 FFI 示例时出现 "cannot find function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55979338/
我正在努力通过接受 void 的 FFI 传递结构并在另一端读回它。 有问题的库是 libtsm,一个终端状态机。它允许您提供输入,然后找出输入后终端将处于哪种状态。 它将其绘制函数声明为: pub
只是为了测试目的,我在 delphi 中创建了一个小的 DLL。代码为: library MyDll; uses SysUtils, Classes, Vcl.Dialogs;
这是我一直好奇的事情:我想知道 LuaJIT 的 FFI 模块如何设法使用正确的调用约定来调用外部 native 函数,而无需在用户原型(prototype)中进行任何声明。 我尝试阅读源代码以自己解
我有一个带有函数的 C 库,在一个不透明的结构上运行,定义如下: Foo* makeFoo(); // create a new Foo Foo* dupFoo(const Foo* orig); /
我正在尝试从 purescript 调用 navigator.geolocation.getCurrentPosition javascript 函数,但遇到了两个问题。 在 javascript 中
ruby 版本 2.2.4p230 RubyGem 版本 2.7.2 已安装 Ruby-devel 和 lib64ffi-devel。 使用 64 位 OpenMandriva 3.0、urpmi 和
我正在尝试使用 FFI 将以下 JavaScript 函数导入 PureScript: function getGreeting() { return "Hi, welcome to the sh
我对 Haskell 中的 FFI 有一些疑问 我知道我必须使用语言编译指示 {-# LANGUAGE ForeignFunctionInterface #-}但是当我使用 {-# LANGUAGE
当我尝试构建 Flutter项目至 IOS 它向我显示了这个错误,我尝试清理并尝试更改项目的目录。 Launching lib/main.dart on iPhone 12 Pro Max in de
完整堆栈跟踪: /Users/galharth/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencie
我试过运行 pod install在我的 Xcode 项目中,但出现以下错误 /System/Library/Frameworks/Ruby.framework/Versions/2.6/us
我需要在节点 Electron 项目中使用模块“ffi”。我可以使用“gyp”重建它并在节点中使用库,但我不能使用“electron-rebuild”重建它并在 Electron 中使用它。 我跑了:
以下警告是什么意思,我该如何解决它的原因? Warning: Unimplemented primitive used:removeEventListener 在 [@bs.val] external
谁能告诉我一个使用带有可变参数的 C 函数(例如 printf )和 Haskell 的外部函数接口(interface)的示例?我尝试搜索 HaskellWiki,但没有找到这样的示例。 谢谢! 最
我使用 FFI 是为了在 C 中使用一个函数,该函数接受一个结构并返回相同的结构。我看到的引用说我必须使用指向这些结构的指针才能将其导入 Haskell。所以,例如。 data Bar = Bar {
我想在带有 FFI 的 Rust 中包含一个动态 C 库。 该库实际上也是用 Rust 构建的,但公开了一个 C 接口(interface),因此它也可以从其他语言中使用。当我用 cargo 构建库(
我试图在winapi上写一个包装器。我想包装接受回调函数指针的函数。 例如,考虑以下情况: // The unsafe callback type the FFI function accepts t
我正在使用 rust-bindgen 从 Rust 访问 C 库。一些函数返回指向结构的可空指针,bindgen 表示为 extern "C" { pub fn get_some_data()
介绍 我正在用 inline-c 包装一个 C 数值库;一些函数可以将回调传递给步骤例程,考虑 ODE 的优化或时间积分。 特别是在原生 C 中,使用回调可以对连续数组进行操作,通过指针修改它们,并将
fn main() { let val = 0; unsafe { foo(&val) } } extern "C" { pub fn foo(val: *const u32)
我是一名优秀的程序员,十分优秀!