Je souhaiterais, dans l'intérêt d'un interpréteur de ma création, pourvoir utiliser des fonctions externes et "inconnues"; en gros faire une FFI.
Naïvement, je me dis qu'il suffit d'exécuter dans le programme actuel (donc dans mon interpréteur) une fonction en provenance d'un fichier C externe, par exemple :
// FonctionExterne.c
#include <stdio.h>
#include <stdlib.h>
int test(int x) {
printf("'test' va renvoyer %d.", x * x); // Il faudrait évidemment pouvoir exécuter n'importe quoi
return x * x;
}
J'aimerai si possible ne pas dépendre d'un compilateur C externe, comme GCC ou CLang pour la portabilité.
Voici comment j'imagine l'appel dans mon interpréteur :
// Dans mon interpréteur
void executeExternC(FILE file, char* fname, int* args) {
FROM file EXECUTE fname WITH args;
}
Mais je ne sais pas
Si c'est possible ;
Comment faire
Si c'est une bonne façon de faire
Pour mon interpréteur, cela ressemble à faire en C
extern "C" int test(int);
mais évidemment, on ne peut pas faire ça de manière dynamique, au runtime.
Ce que tu veux faire, c'est le rôle d'une dll (windows) ou d'un .so (Linux).
En fait, si tu as déjà compilé un .c avec ta fonction devant en exe, c'est trop tard : la fonction n'existe plus. c'est devenu juste une adresse. Donc tu ne pourras jamais l'appeler de dehors.
La dll, le principe, c'est que c'est comme un programme sans main, mais avec une ou plusieurs fonctions dites "exportées" (qu'il faudra définir comme exportées) et qui seront un (ou plusieurs) point d'entrée que tu pourras du coup appeler depuis un autre programme.
Si je comprend bien, je devrais dès lors compiler FonctionExtern.c au format DLL, pour ensuite pouvoir utiliser cette DLL dans mon interpréteur, et donc avoir accès à ma fonction test?
Entre temps j'avais trouvé cette solution, mais pour la plateforme Windows (avec LoadLibrary et GetProcess), je comprend mieux à présent avec ton exemple, et en prime je vais pouvoir rendre ça portable
Une autre source d'info, regarder comment c'est fait dans un vrai soft qui marche avec des plugins, et qui est installable sur plusieurs systèmes, omme PHP ou Apache.
- Edité par michelbillaud 15 août 2019 à 14:22:31
Exécuter une fonction C externe dans le programme
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html