Table des matières
Bonne réponse
Maison développement back-end Golang Fonctions de rappel de Rust to Go

Fonctions de rappel de Rust to Go

Feb 05, 2024 pm 11:03 PM
typedef

从 Rust 到 Go 的回调函数

Contenu de la question

J'essaie de créer la possibilité d'appeler une fonction rust from go, puis ladite fonction rust rappelle la fonction to go. J'utilise cgo comme interface ffi entre go et rust. Voici mon code go (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
    })
}
Copier après la connexion

Voici mon code rust (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);
    }
}
Copier après la connexion

Voici mon fichier cargo.toml :

[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 = [    ".",]
Copier après la connexion

Voici lib/move.h (le fichier d'en-tête de la bibliothèque partagée) :

#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
Copier après la connexion

Voici mon makefile :

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
Copier après la connexion

La structure du fichier est la suivante :

src
    main.go
    main.rs
bin
    libgo_move.so (after cargo build)
lib
    move.h
cargo.toml
makefile
Copier après la connexion

Après l'exécution de make clean build, j'obtiens le résultat suivant :

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
Copier après la connexion

Pour une raison quelconque, il ne trouve pas la fonction ffi.


Bonne réponse


C'est une erreur stupide :

/*
#cgo CFLAGS: -I./../lib
#cgo LDFLAGS: -L./../bin -lgo_move -Wl,-rpath=./bin
#include "move.h"
*/
Copier après la connexion

Doit être fait avant l'importation. C'est tout.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Utilisation de la structure typedef en langage C Utilisation de la structure typedef en langage C May 09, 2024 am 10:15 AM

typedef struct est utilisé en langage C pour créer des alias de type de structure afin de simplifier l'utilisation des structures. Il crée un alias pour un nouveau type de données sur une structure existante en spécifiant l'alias de la structure. Les avantages incluent une lisibilité améliorée, la réutilisation du code et la vérification du type. Remarque : La structure doit être définie avant d'utiliser un alias. L'alias doit être unique dans le programme et valide uniquement dans le périmètre dans lequel il est déclaré.

Comprendre la gestion de la mémoire des pointeurs de fonction C++ : éviter les pièges de pointeur Comprendre la gestion de la mémoire des pointeurs de fonction C++ : éviter les pièges de pointeur Apr 29, 2024 pm 09:03 PM

Lors de l’utilisation de pointeurs de fonction en C++, la gestion de la mémoire doit être soigneusement réfléchie pour éviter les pièges. Ces pièges incluent des pointeurs suspendus (pointant vers des fonctions en dehors de leur portée) et des pointeurs sauvages (pointeurs de fonction qui ne sont jamais initialisés ou définis sur nullptr). Pour éviter ces pièges, suivez ces bonnes pratiques : initialisez toujours les pointeurs de fonction, gérez soigneusement la mémoire et utilisez des pointeurs intelligents. De cette façon, vous pouvez utiliser les pointeurs de fonction en toute sécurité et éviter de tomber dans les pièges des pointeurs.

A quoi sert typedef A quoi sert typedef Sep 04, 2023 pm 01:20 PM

L'utilisation de typedef consiste à créer de nouveaux alias pour les types de données existants. L'utilisation de typedefs peut augmenter la lisibilité et la maintenabilité de votre code, en particulier lorsqu'il s'agit de types de données complexes. Pour les types de données simples, tels que les entiers, les nombres à virgule flottante ou les caractères, les avantages de l'utilisation d'alias ne sont pas évidents. Cependant, pour les types de données complexes tels que les pointeurs, les structures, les tableaux et les fonctions, les avantages de l'utilisation d'alias sont évidents. Un typedef ne peut pas être utilisé avant la définition d'une variable ou d'une fonction et est généralement créé en haut d'un fichier programme ou après une définition de structure.

Explication détaillée du développement du minuteur du noyau Linux et du pilote de travail différé Explication détaillée du développement du minuteur du noyau Linux et du pilote de travail différé Feb 13, 2024 am 11:57 AM

Les minuteries du noyau Linux et les tâches de retard sont deux mécanismes couramment utilisés pour implémenter des tâches planifiées et des tâches d'exécution différée. Ils permettent au pilote d'exécuter des fonctions spécifiques au moment approprié pour s'adapter aux besoins et aux caractéristiques du périphérique matériel. Mais comment utiliser correctement les timers du noyau Linux pour gérer les retards ? Cet article présentera les connaissances et les compétences de base du développement de pilotes de minuterie et de retard du noyau Linux sous les aspects théoriques et pratiques, ainsi que certains problèmes et solutions courants. Le minuteur du logiciel de minuterie du noyau s'appuie en fin de compte sur l'horloge matérielle. En termes simples, le noyau détectera si chaque minuteur enregistré dans le noyau a expiré après l'expiration de l'horloge, il rappellera la fonction d'enregistrement correspondante. ceci comme une interruption de la moitié inférieure. Réalité

Comment écrire du code simple pour les feux d'artifice en langage C Comment écrire du code simple pour les feux d'artifice en langage C Apr 13, 2024 pm 09:18 PM

Pour écrire un code de feu d'artifice simple en C, vous devez suivre ces étapes : Inclure les fichiers d'en-tête et les bibliothèques. Définir des constantes et des macros. Créez une structure de données de particules. Déclarez les variables globales. Initialisez les particules de feux d'artifice dans la fonction main(). Mettez à jour la position et la vitesse de la particule dans la boucle de jeu et dessinez-les. Recherchez et détruisez les particules qui ont atteint leur fin de vie.

La différence entre la structure typedef et la structure en C++ La différence entre la structure typedef et la structure en C++ May 01, 2024 am 11:36 AM

La différence entre typedef struct et struct : typedef struct crée un alias d'un type de structure, tandis que struct définit un nouveau type de structure. L'alias créé par typedef struct peut être utilisé après sa déclaration, tandis que la structure définie par struct peut être utilisée après sa définition. Ni la structure typedef ni la structure ne créent d'espace de stockage supplémentaire.

Transformez le code avec des pointeurs de fonctions C++ : améliorez l'efficacité et la réutilisabilité Transformez le code avec des pointeurs de fonctions C++ : améliorez l'efficacité et la réutilisabilité Apr 29, 2024 pm 06:45 PM

La technologie des pointeurs de fonction peut améliorer l'efficacité et la réutilisabilité du code, en particulier comme suit : Efficacité améliorée : l'utilisation de pointeurs de fonction peut réduire la répétition du code et optimiser le processus d'appel. Améliorer la réutilisabilité : les pointeurs de fonction permettent d'utiliser des fonctions générales pour traiter différentes données, améliorant ainsi la réutilisabilité du programme.

Fonctions de rappel de Rust to Go Fonctions de rappel de Rust to Go Feb 05, 2024 pm 11:03 PM

J'essaie de créer la possibilité d'appeler une fonction rust from go, puis ladite fonction rust rappelle la fonction to go. J'utilise cgo comme interface ffi entre go et rust. Voici mon code go (src/main.go) : packagemainimport("c""fmt""unsafe")/*#cgocflags:-i./../lib#cgoldflags:-l./../bin -lgo_move-wl,-rpath=./bin#include"m

See all articles