• Rust FFI将特征对象作为上下文传递来调用回调
    好吧,我正在努力实现以下目标:C生锈rust回调到c并在用户定义的trait对象上注册回调c在上下文中调用rustrust对上下文(trait对象)调用回调我已经玩了很久了。我已经走得很远了,但还没有走得很远。C位:#include <dlfcn.h> #include <stdio.h> void *global_ctx; void c_function(void* ctx) { printf("Called c_function\n"); global_ctx = ctx; } i...
  • 构造字段声明顺序在Rust中重要吗?
    我知道在C语言中,编译器不允许对结构字段重新排序,这对结构的内存布局和对齐非常重要。我是rust的初学者,因为如果允许rustc从字段在结构中的声明顺序重新排序字段,那么大部分原始指针都是隐藏的(我知道您仍然可以使用它们)。最佳答案:从rust reference struct.md开始:默认情况下,struct的内存布局是未定义的,以允许编译器优化,如字段重新排序,但可以使用repr属性修复它。在任何一种情况下,字段都可以在相应的结构表达式中以任何顺序给出;得到的struct值将始终具有相同的内存布局。 ...
  • 如何在Rust FFI中访问C全局变量/常量?
    我需要得到一个从锈中的c导出的常数的值。我想从实际符号中读取该值,而不仅仅是复制'n'粘贴该值以生锈(在我的例子中,该值是指针,c检查指针是否相等)。extern void *magic; 要在rust中读取magic: *const c_void的语法是什么?最佳答案:use std::os::raw::c_void; extern "C" { #[no_mangle] static magic: *const c_void; } 或者,在extern之前可以有#[link(kind="...
  • 如何将Rust`Args`转换为argc和argv C等效项?
    我正在使用一个需要MPI_Init的C API(特别是int argc, char **argv)。我试图用以下代码生成一个等价的argc, argv:let argc = std::env::args().len() as c_int; let c_strs: ~[CString] = std::env:args().map(|s: & &str| s.to_c_str()); let mut argv: ~[*c_char] = c_strs.map(|c: &CString| c.with_ref(|...
  • 使用Rust和Amethyst的Linux上缺少的库
    当我在Ubuntu 18.04上尝试cargo build这个amethyst的“hello world”时,我得到了一个关于lxbcb中缺少库的错误。我不确定这个错误是想告诉我什么,也不知道该如何解决。似乎我缺少库-lxcb-render、-lxcb-shap和-lxcb-xfixes,但似乎找不到它们。紫水晶世界密码extern crate amethyst; use amethyst::{ prelude::*, renderer::{DisplayConfig, DrawFlat,...
  • 如何将C字符串转换为Rust字符串并通过FFI返回?
    我正在尝试获取一个C库返回的C字符串,并通过FFI将其转换为一个Rust字符串。Mylib.c公司const char* hello(){ return "Hello World!"; } 主要资源#![feature(link_args)] extern crate libc; use libc::c_char; #[link_args = "-L . -I . -lmylib"] extern { fn hello() -> *c_char; } fn main() { /...
  • 在多个线程中独立运行Boehm GC
    我正在尝试写一些bindings到boehm gc的锈。一些背景:rust被设计成一种高并发语言,这种设计的结果是能够静态地将gc指针限制在它们被分配的线程内(也就是说,在线程x中分配的gc指针永远不能被另一个线程保持活动(甚至根本不能被引用)。因此,我希望促使博姆尽可能利用这一点来提高业绩:线程安全,因此我可以从多个线程分配和收集尽可能少地停止集合(即仅停止当前线程),其他线程可以继续运行,因为它们不可能干扰自身之外与gc指针相关的任何内容最好是完全本地线程,不同线程的gc“实例”之间不同步1很容易,但我...
  • 在Rust中创建C函数指针的接口
    我可能没有正确地描述我的问题标题,如果需要请编辑它。我正在尝试将rust接口打包到LXC library,它是用c编写的。我已经成功地调用了一些简单的函数,比如lxc_get_version或lxc_container_new,但是我无法访问struct lxc_container块中描述的函数。以下是我的代码:#[link(name = "lxc")] extern { // LXC part fn lxc_get_version() -> *const c_char; fn lx...
  • 是否可以在运行时生成和执行Rust代码?
    使用c,在运行时,我可以:创建函数的源代码,调用gcc将其编译为.so(linux)(或使用llvm等),加载.so,然后调用函数。同样的东西也可能生锈吗?特别是我想使用代数数据类型,所以使用rust的c子集是不够的。最佳答案:官方还没有,不过至少应该不会有太多黑客攻击。最大的障碍是库还没有任何能力进行动态加载。这里有一个潜在的策略,使它发挥作用(对铁锈的新分支)。链接到rustc板条箱以编程方式驱动编译器。请注意,编译器不是线程安全的,因此一次只能运行一个进程内生成。用#[no_mangle]标记要调用的...
  • 锈蚀与C性能
    我想学习一些关于rust任务的知识,所以我做了一个monte carlo计算关于圆周率。现在我的困惑是为什么单线程C版本要快4倍比四通螺纹生锈的版本。很明显我做错了什么,或者我的精神表现模式太差了。这是C版本:#include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #define PI 3.1415926535897932 double monte_carlo_pi(int nparts) { ...
  • 我想从Rust语言中调用C库“ mysql.h”
    我正在尝试从rust代码连接到mysql。我试过这些步骤。一。我使用mysql.h和下面的命令编写了c代码。 $ gcc -shared mysqlrust.c -o libmysqlrust.so $(mysql_config --cflags) $(mysql_config --libs) $(mysql_config --cflags) $ cp libmysqlrust.so /usr/local/lib/rustc/i686-unknown-linux-gnu/lib/ 2.我写了锈代码...
  • Rust常数/静态值可以暴露于C吗?
    假设我有一个包含常量或静态的rust api,例如i32。我想从C使用这个RustAPI。从C方面来说,我想使用这个常量作为数组大小。我说没办法做是对的吗?在为rust api的其余部分提供声明的c头文件中,重新声明常量是最好的解决方案吗?更新:更具体地说,我使用的编译器不支持可变长度数组(Visual C++ 2005)。最佳答案:你当然可以做到,至少在函数内部:cnst.rs:#[no_mangle] pub static X: i32 = 42; cnstuse.c:#include <stdint....
  • 将Rust任务嵌入到C程序中?
    从rust程序(由rustc编译的可执行文件)调用c库函数运行良好,也是rust团队的目标。从c程序(由clang编译的可执行文件)调用rust crate函数可以处理简单的事情,但是如果我生成一个任务,它就会崩溃。我怎样才能使生锈的工作?这是我的来源和错误信息。您也可以从https://github.com/Eonil/TeachingMyselfRust下载阿拉伯卢比#[no_mangle] pub fn test1() { let a1 = proc() { }; ...
  • 创建包含字符串的静态C结构
    我试图在rust中创建一个动态库,它将一个结构作为一个符号导出,并通过dlopen()加载到c程序中。然而,我在访问结构中的第二个字符串时遇到了一些segfaults,所以我做了一个小测试程序来尝试找出我做错了什么。这是rust代码(test.rs),用“rustc--crate type dylib test.rs”编译:#[repr(C)] pub struct PluginDesc { name: &'static str, version: &'static str, des...
  • 将C预处理器转换为Rust
    我正在移植一些C代码以进行Rust,该代码包含许多类似的内容:#define CONFIG_FLAG_NUMBER_23 1 #define THIS 10 #define THAT 11 #define THIS_AND_THAT (THIS + THAT) #if CONFIG_FLAG_NUMBER_23 #define THIS_OR_THAT THIS #else #define THIS_OR_THAT THAT #endif #define ROOT_DIR "/root" #define...
  • 如何检查从C传递的函数指针是否为非NULL
    下面的示例代码生锈部分:#[no_mangle] pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 { fun(value) } C部分:int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t)); int32_t triple(int32_t x) { return x*3; } int main(int argc, char *...
  • 是否可以将C枚举包装在Rust中?
    有可能把C枚举用锈包起来吗?例如C enum example最佳答案:是的,没有变化(除了空白以适应流行的生锈风格):enum List { MaxLogLevel = 1, MaxNumMessages, TrilinearFiltering, MaxAnisotropy, TexCompression, SRGBLinearization, LoadTextures, FastAnimation, ShadowMapSize, ...
加载中...
公众号