cari
Rumahpembangunan bahagian belakangGolangFungsi panggil balik dari Rust to Go
Fungsi panggil balik dari Rust to GoFeb 05, 2024 pm 11:03 PM
typedef

从 Rust 到 Go 的回调函数

Kandungan soalan

Saya cuba mencipta kemungkinan untuk memanggil fungsi karat dari pergi dan kemudian berkata fungsi karat memanggil semula fungsi untuk pergi. Saya menggunakan cgo sebagai antara muka ffi antara go dan rust. Inilah kod pergi saya (src/main.go):

package main

import (
    "c"
    "fmt"
    "unsafe"
)

/*
#cgo cflags: -i./../lib
#cgo ldflags: -l./../bin -lgo_move -wl,-rpath=./bin
#include "move.h"
*/

//export cosmoscallbackwrapper
func cosmoscallbackwrapper(data *c.uchar, datalen c.int) {
    // convert data to go slice
    godata := c.gobytes(unsafe.pointer(data), datalen)

    // call the actual callback function
    cosmoscallback(godata)
}

// setcosmoscallback sets the callback function to be called by the move vm.
func setcosmoscallback(callback func([]byte)) {
    cosmoscallback = callback
    c.set_cosmos_callback((c.cosmos_callback)(unsafe.pointer(c.cosmoscallbackwrapper)))
}

var cosmoscallback func([]byte)

func main() {
    // create a new move interpreter

    // set the callback function
    setcosmoscallback(func(data []byte) {
        fmt.println("received data from move vm:", data)
        // handle data and call cosmos sdk functions as needed
    })
}

Ini kod karat saya (src/lib.rs)

use std::os::raw::{c_char, c_int};
use std::ffi::cstring;
use std::sync::mutex;
#[macro_use] extern crate lazy_static;
pub fn main() {
}
pub type cosmoscallback = extern "c" fn(*const c_char, c_int);

lazy_static! {
        static ref callback: mutex<option<cosmoscallback>> = mutex::new(none);
}

#[no_mangle]
pub extern "c" fn set_cosmos_callback(callback: cosmoscallback) {
        let mut cb = callback.lock().unwrap();
        *cb = some(callback);
}
#[no_mangle]
pub extern "c" fn cosmoscallbackwrapper(data: *const c_char, data_len: c_int) {
    let cb = callback.lock().unwrap();
    if let some(callback) = &*cb {
        callback(data, data_len);
    }
}

Ini ialah fail kargo.toml saya:

[package]
name = "go-move"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
libc = "0.2"
lazy_static = "1.4.0"


[workspace]
members = [    ".",]

Ini ialah lib/move.h (fail pengepala perpustakaan kongsi):

#ifndef move_vm_lib_h
#define move_vm_lib_h

#include <stdint.h>
//typedef void (*cosmos_callback)(const unsigned char *data, int data_len);
//void set_cosmos_callback(cosmos_callback callback);

typedef void (*cosmos_callback)(const uint8_t* data, int32_t data_len);

void set_cosmos_callback(cosmos_callback callback);
#endif

Ini fail buatan saya:

shell := /bin/bash
.phony: build
os = $(shell uname)
clean:
        rm -rf bin
        rm -rf target
build:
        @echo the os is $(os)
        mkdir bin
        cargo build --release
ifeq ($(os),linux)
        cp target/release/libgo_move.so bin/
else
        cp target/release/libgo_move.dylib bin/
endif
        cp -a lib/. bin/
        go build --ldflags="-l./bin -lgo_move" -o bin/main src/main.go
run:
        export ld_library_path=./bin && ./main

Struktur fail adalah seperti berikut:

src
    main.go
    main.rs
bin
    libgo_move.so (after cargo build)
lib
    move.h
cargo.toml
makefile

Selepas berjalan make clean build Saya mendapat output berikut:

cp target/release/libgo_move.so bin/
cp -a lib/. bin/
go build -o bin/main  src/main.go
# command-line-arguments
src/main.go:27:59: could not determine kind of name for C.cosmosCallbackWrapper
src/main.go:27:25: could not determine kind of name for C.cosmos_callback
src/main.go:27:2: could not determine kind of name for C.set_cosmos_callback

Atas sebab tertentu ia tidak dapat mencari fungsi ffi.


Jawapan betul


Ini adalah kesilapan bodoh:

/*
#cgo CFLAGS: -I./../lib
#cgo LDFLAGS: -L./../bin -lgo_move -Wl,-rpath=./bin
#include "move.h"
*/

Mesti dilakukan sebelum mengimport. Itu sahaja.

Atas ialah kandungan terperinci Fungsi panggil balik dari Rust to Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:stackoverflow. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
typedef的用法是什么typedef的用法是什么Sep 04, 2023 pm 01:20 PM

typedef的用法是为已经存在的数据类型创建新的别名。使用typedef可以增加代码的可读性和可维护性,特别是在处理复杂的数据类型时。对于简单的数据类型,如整数、浮点数或字符,使用别名的好处并不明显。然而,对于指针、结构体、数组和函数等复杂的数据类型,使用别名的优势就显而易见了。typedef不能用于变量或函数定义之前,通常在程序文件的顶部或结构体定义之后创建。

Linux内核定时器与延迟工作驱动开发详解Linux内核定时器与延迟工作驱动开发详解Feb 13, 2024 am 11:57 AM

Linux内核定时器与延迟工作是两种常用的实现定时任务和延后执行任务的机制,它们可以让驱动程序在合适的时间点执行特定的函数,以适应硬件设备的需求和特性。但是,如何正确地使用Linux内核定时器与延迟工作呢?本文将从理论和实践两方面,介绍Linux内核定时器与延迟工作驱动开发的基本知识和技巧,以及一些常见的问题和解决方法。内核定时器软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实

c语言简单烟花代码怎么写c语言简单烟花代码怎么写Apr 13, 2024 pm 09:18 PM

要编写一个简单的 C 语言烟花代码,需要遵循以下步骤:包含头文件和库。定义常量和宏。创建粒子数据结构。声明全局变量。在 main() 函数中初始化烟花粒子。在游戏循环中更新粒子的位置和速度,并绘制它们。检查和销毁已达到寿命的粒子。

使用 gcc (mingw32) 编译带有静态库的 DLL使用 gcc (mingw32) 编译带有静态库的 DLLFeb 09, 2024 am 10:00 AM

我有一个由外部工具(即cgo)生成的静态库,我们将其称为libsecondary.a。我想生成一个动态库,同时包含“libsecondary.a”作为依赖项,我在libsecondary.h中导出一个名为onprocessinit()的函数,并在dll_process_attach事件上调用它。我尝试生成共享库,但似乎无法使用x86_64-w64-mingw32-共享-l。-lsecondary-static-libgcc-static-libstdc++-static.\d

深入了解C++和C语言的异同深入了解C++和C语言的异同Mar 26, 2024 am 09:36 AM

C++和C语言是两种流行的编程语言,它们在很多方面都相似,但也有许多显著的差异。本文将深入探讨C++和C语言的异同点,并通过具体的代码示例来说明它们之间的差异。一、基本语法和结构差异1.1数据类型定义在C语言中,定义变量时需要先声明数据类型,例如:intnum;而在C++中,可以在定义变量的同时进行初始化,例如:intnum=10;1.2函数定义

C++ 函数指针的应用场景有哪些?C++ 函数指针的应用场景有哪些?Apr 12, 2024 am 09:51 AM

函数指针应用于以下场景:回调函数:允许在函数调用完成后执行另一个函数。多态性:根据对象类型动态调用不同方法。数据结构存储:将函数存储在数据结构中,以便在运行时调用。优化性能、代码重用、测试和模拟等其他场景。

Linux 下的信号机制:如何使用信号进行进程间通信和控制Linux 下的信号机制:如何使用信号进行进程间通信和控制Feb 12, 2024 pm 12:40 PM

信号是Linux系统中一种常用的进程间通信和控制的方法,它可以让一个进程向另一个进程发送一个简单的消息,通知它发生了某种事件或者状态。信号的作用是提高系统的响应性和灵活性,以应对一些异常或者紧急的情况。在Linux系统中,有很多种信号,如SIGINT、SIGTERM、SIGKILL等,它们各有各的含义和作用,适用于不同的场景和需求。但是,你真的了解Linux下的信号机制吗?你知道如何在Linux下使用信号进行进程间通信和控制吗?你知道如何在Linux下处理和忽略信号吗?本文将为你详细介绍Linu

C++ 函数指针的优势和局限性有哪些?C++ 函数指针的优势和局限性有哪些?Apr 17, 2024 pm 03:36 PM

函数指针的优势包括:灵活性、代码重用、回调函数、事件处理。局限性包括:类型安全性、内存管理、运行时开销。实战案例:定义函数指针类型,创建指向比较函数的函数指针,调用函数指针比较两个数字。

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual