IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Depuis Ocaml appeller du C++ utilisant lui-même une librarie dynamique


Sujet :

Caml

  1. #1
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut Depuis Ocaml appeller du C++ utilisant lui-même une librarie dynamique
    J'ai besoin comme le titre l'indique de construire un module Ocaml/C++ qui lui-même fait usage d'une librairie dynamique .so (linux)

    Tant qu'il s'agit de construire le stub Ocaml/C pas de problème mais c'est au moment de lier la librairie so avec ocamlmklib ou ocamlopt que j'ai un soucis

    pour info je suis sous gcc 4.5 (donc C++11)

    les fichiers de la librairie dynamique:

    hello.hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <iostream>
    #include <string>
    #include <memory>
     
    using namespace std;
     
    class HelloApplication
    {
    public :
     
    	HelloApplication();
    	~HelloApplication();
     
    	void say(string s);
     
    };
     
    typedef HelloApplication *(*create_hello)();
    hello.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include "hello.hpp"
     
    HelloApplication::HelloApplication(){}
    HelloApplication::~HelloApplication(){}
     
    void HelloApplication::say(string s)
    {
    	 cout << "Hello : " << s << endl;
    }
     
    extern "C"
    {
        HelloApplication *create()
        {
            return new HelloApplication();
        }
     
    }
    le fichier CMake.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    cmake_minimum_required(VERSION 2.6)
     
    project(testHello_proj)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Release" FORCE)
    #set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Debug" FORCE)
     
    set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE})
     
    ## Compiler flags
    if(CMAKE_COMPILER_IS_GNUCXX)
        set ( CMAKE_CXX_FLAGS "-O2 -std=c++0x" 
            CACHE STRING "g++ Compiler Flags for All Builds" FORCE)
     
        set ( CMAKE_CXX_FLAGS_DEBUG "-std=c++0x -O2 -g -Wall"
            CACHE STRING "g++ Compiler Flags for Debug Builds" FORCE)
     
        set ( CMAKE_CXX_FLAGS_RELEASE  "-O2 -fmessage-length=0 -std=c++0x"
    	CACHE STRING "g++ Compiler Flags for Release Builds" FORCE)
     
        set ( CMAKE_CXX_FLAGS_MINSIZEREL  "-Os -std=c++0x"
    	CACHE STRING "g++ Compiler Flags for Release minsize builds" FORCE)
     
        set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO  "-O2 -g1 -std=c++0x"
    	CACHE STRING "g++ Compiler Flags for Release with Debug Info builds" FORCE)
     
    endif()
     
    file(
        GLOB_RECURSE
        source_files
        src/*
    )
     
    add_library(
    	testHello
    	SHARED
    	${source_files}
    )
    j'obtiens une librairie nommée libtestHello.so

    les fichiers du module Ocaml/C++ nommé mymod:

    mymod_stubs.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <cstdlib>
    #include <dlfcn.h>
    #include <string>
     
    #include "hello.hpp"
     
    extern "C" {
    #include <memory.h>
    #include <mlvalues.h>
    }
     
    using namespace std;
     
    HelloApplication* hello;
     
    extern "C" value initHello (value unit) {
    	CAMLparam1 (unit);
     
    	create_hello hello_pMaker;
     
    	void* hello_hndl = dlopen("/path_to_cmake_dir/build/lib/Release/libtestHello.so", RTLD_LAZY);
     
    	if(hello_hndl == NULL)
    	{
    		cerr << "dlopen : " << dlerror() << endl;
    		exit(EXIT_FAILURE);
    	}
     
    	void *hello_mkr = dlsym(hello_hndl, "create");
    	if (hello_mkr == NULL)
    	{
    	  cerr << "dlsym : " << dlerror() << endl;
    	  exit(EXIT_FAILURE);
    	}
     
    	hello_pMaker = (create_hello)hello_mkr;
     
    	HelloApplication* hello_ptr(hello_pMaker());
    	hello = hello_ptr;
     
    	CAMLreturn (Val_unit);
    }
     
    extern "C" value say (value v_str) {
      CAMLparam1 (v_str);
     
      string s = String_val(v_str);
     
      hello->say(s);
     
      CAMLreturn (Val_unit);
    }
    mymod.ml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    external initHello : unit -> unit = "initHello"
     
    external say : string -> unit = "say"
    caller.ml (le fichier de test) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mymod.initHello;;
     
    Mymod.say "tout le monde";;
    le makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CPPSRC=mymod_stubs.cpp
    CPPOBJ=mymod_stubs.o
    CPPINC=-I/usr/local/lib/ocaml/caml -I/path_to_cmake_dir/src
    CPPLIB=-std=c++0x
    MODSRC=mymod.ml
    MODNAME=mymod
    OPTOBJ=mymod.cmx
    OPTLIB=mymod.cmxa
    CALLERSRC=caller.ml
    OPTCALLERFLAGS=-I . -cclib
    CALLERLIB=-lstdc++
    OPTCALLEREXEC=caller.opt
     
    all: opttest
     
    #g++
     
    cppcompile:
    	g++ -o ${CPPOBJ} ${CPPLIB} ${CPPINC} -c ${CPPSRC}
     
    #native
     
    optcompile:	cppcompile
    	ocamlopt -c ${MODSRC}
     
    optmklib:	optcompile
    	ocamlmklib -o ${MODNAME} -ccopt -L/path_to_cmake_dir/build/lib/Release -cclib -ltestHello ${CPPOBJ}
    	ocamlmklib -o ${MODNAME} -ccopt -L/path_to_cmake_dir/build/lib/Release -cclib -ltestHello ${OPTOBJ}
     
    opttest:	optmklib
    	ocamlopt ${OPTCALLERFLAGS} ${CALLERLIB} ${OPTLIB} ${CALLERSRC} -o ${OPTCALLEREXEC}
     
    #clean
     
    clean :
    	rm -f *.cma *.cmo *.cmx *.cmxa *.cmi *.so *.a *.o ${OPTCALLEREXEC}
    le tout compile mais impossible de trouver ou d'ouvrir la librairie libtestHello.so :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $: ./caller.opt
    ./caller.opt: error while loading shared libraries: libtestHello.so: cannot open shared object file: No such file or directory
    je suis plutot novice avec les outils ocaml donc je dois dire

    en espérant que qqun passe par ici

    merci

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,
    je n'ai jamais utilisé une biblio dynamique dans le cadre d'un binding C++/Ocaml (je suis resté cantonné au C/Ocaml), je ne fais donc qu'échafauder des théories envisageables.

    Je sais qu'ocamlopt optimise au maximum quitte à faire du unsafe. Peux-tu tenter de compiler avec ocamlc ? tu apprendras peut être de ce test.

    Cdlt,
    -- Yankel Scialom

  3. #3
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    le message d'erreur "libtestHello.so: No such file" en français ça veux dire qu'il ne trouve pas ton fichier "libtestHello.so", donc ça ressemble à un problème de PATH

  4. #4
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    pour rappel, sous Linux le système recherche les lib*.so dans /usr/lib et /usr/local/lib
    si ta lib n'est pas dans un de ces répertoires tu peux utiliser LD_LIBRARY_PATH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_LIBRARY_PATH=`pwd`

Discussions similaires

  1. Contenu d'une variable devenant lui même une variable
    Par Copyright83 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 14/11/2012, 17h24
  2. [XL-2000] Créer un fichier à partir d'une macro contenant lui même une macro
    Par nicogau18 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/07/2010, 16h05
  3. [PHP 5.2] Formulaire s'appellant lui-même avec liens vers un autre formulaire
    Par Lamanne dans le forum Langage
    Réponses: 12
    Dernier message: 15/02/2009, 13h51
  4. [Joomla!] Gestion des menus depuis le site lui-même
    Par roots_man dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 22/12/2008, 16h14
  5. Appelle d'un fichier a lui même
    Par attila771 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/06/2006, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo