Fonctions de rappel de Rust to Go
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 }) }
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); } }
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 = [ ".",]
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
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
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
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
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" */
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds





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é.

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.

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.

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é

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 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.

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.

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
