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

 C Discussion :

Problème de création et de lecture de SO (Shared Object)


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut Problème de création et de lecture de SO (Shared Object)
    Bonjour tout le monde ,
    Je viens à vous pour de l’aide
    Je suis entrain depuis hier d’essayer de créer une so (Shared Object) sous Linux dont le code c-c++ est équivalent à une DLL sous Windows.
    Donc en gros j’ai créé un .cpp contenant 3 simples fonctions, un header et un .def sous visual 2010. Visual me crée ma DDL.
    Ensuite je lis la DDL grâce à JNA sous Windows avec NetBeans.
    J’arrive à lire ma DLL sans problème.
    Maintenant j’essaye de créer une SO. Je me doute bien qu’il faut changer une partie du code de mes fichiers. Mais là, je suis perdu, je ne trouve rien qui m’aide sur Internet et je bloque.
    Voici mes codes :
    .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
    // myDLL.cpp : Defines the exported functions for the DLL application.
    //
     
    #include "myDLL.h"
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
     
    BOOL APIENTRY myDLL(HANDLE hModule, DWORD ul_reason_for_call,
    LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    		case DLL_PROCESS_ATTACH:
    		case DLL_THREAD_ATTACH:
    		case DLL_THREAD_DETACH:
    		case DLL_PROCESS_DETACH:
    		break;
    	}
    	return true;
    }
    extern "C" void Initialize()
    {
     
    	printf("\n Bonjour \n");
    }
    extern "C" void Release()
    {
      // Déclaration et initialisation d'un buffer contenant la chaine à écrire
      char chaine[] = "Hello, world !\n";
      // déclaration d'un pointeur sur fichier
      FILE* fichier;
      // ouverture du fichier en mode "append" (ajout)
      fichier = fopen("./sortie.txt","a");
      // écriture de la phrase
      fwrite((void*)chaine,1,strlen(chaine),fichier);
      // fermeture du fichier
      fclose(fichier);
      // renvoie 0 = pas d'erreur
    }
    extern "C" int TestFunction(int _Value)
    {
    	return (_Value * _Value);
    }
    .h
    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
     
    #ifndef __API_MYDLL_H
    #define __API_MYDLL_H
    #if defined (__cplusplus)
    extern "C" {
    	#endif
    	//Main API functions declaration
    	typedef void (__stdcall *DLL_Function_Initialize) ();
    	typedef void (__stdcall *DLL_Function_Release) ();
    	typedef int (__stdcall *DLL_Function_TestFunction) (int _Value);
     
    	#if defined (__cplusplus)
    }
    #endif
    #endif __API_MYTDLL_H
    .def
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ; TestDLL.def : Declares the module parameters for the application
    LIBRARY myDLL
    DESCRIPTION 'Example of DLL'
    EXPORTS
    ; Explicitly exported initialization routine
    Initialize @1
    Release @2
    TestFunction @3
    Java

    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
     
    package testdlljava;
     
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;
     
     
     
    public class TestDLLJava {
     
        public interface myLib extends Library {
            public void Initialize();
            public void Release();
            public int TestFunction (int _value);  
       }
       public interface myWin extends myLib{}
     
        public static void main(String[] args) {
            // TODO code application logic here
            myLib lib = (myLib) Native.loadLibrary("myDLL",Platform.isWindows() ? myWin.class : myLib.class);//
            System.out.print("\n Resultat :" + lib.TestFunction(5));
            lib.Release();
            System.out.print("\n");
        }
    }
    Donc quand je suis sous Linux avec le code c++, quand je compile en gcc/g++
    il me met évidement problème avec '__stdcall et aussi avec la fonction myDLL obligatoire si j'ai bien compris audessus dans le cpp pour la DLL.

    Questions :

    Est-ce que je fais bien d’uiliser JNA au lieu de JNI par contre ?
    Est-ce que je suis dans le bon pour la DLL ?
    Est-ce que c’est bien de créer la DLL par Visual ?
    Qu’est-ce qu'il faudrait faire pour que je puisse créer le so avec les mêmes fonctions ?

    Enfin je suis preneur de toutes suggestions et je vous remercie déjà d'avance pour le temps que vous consacrez.

    J’espère que je me suis bien exprimé et que je suis dans la bonne partie du forum pour poster.

    Cordialement,
    BASTIN J.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    franchement, c'est un peu le b.rdel, ton truc..

    • .cpp c'et des fichiers C++. Les fichiers C, cest .c
    • JNA ou JNI c'est pour des interfaces JAVA/C ou JAVA/C++


    Enfin, normalement il n'y a aucune différence de programmation entre des DLL et des non-DLL.. Les fichiers sources ne devraient pas changer, sauf "load" explicite souhaité..

    C'est au link que se fait la différence : dans le cas des DLL c'est l'adresse de "jump" de la routine de la DLL qui est stockée dans l'éxécutable. Dans le cas d'une bibliothèque statique c'est le code de la fonction qui est recopié..

    Dans tous les cas les fichiers sources ne sont pas modifiés..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre régulier Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Points : 71
    Points
    71
    Par défaut
    Bonjour John.BE,

    Pour compiler sous linux il faudrait que tu change ton .cpp et .h

    code test.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
     
    // myDLL.cpp : Defines the exported functions for the DLL application.
    //
     
    #include <stdio.h>
     
    extern "C" void Initialize()
    {
        printf("\n Bonjour \n");
    }
     
    extern "C" void Release()
    {
      // Déclaration et initialisation d'un buffer contenant la chaine à écrire
      char chaine[] = "Hello, world !\n";
      // déclaration d'un pointeur sur fichier
      FILE* fichier;
      // ouverture du fichier en mode "append" (ajout)
      fichier = fopen("./sortie.txt","a");
      // écriture de la phrase
      fwrite((void*)chaine,1,strlen(chaine),fichier);
      // fermeture du fichier
      fclose(fichier);
      // renvoie 0 = pas d'erreur
    }
     
    extern "C" int TestFunction(int _Value)
    {
        return (_Value * _Value);
    }
    code test.h:
    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
     
    #ifndef _TEST_SO_H
    #define _TEST_SO_H
     
    #if defined (__cplusplus)
    extern "C" {
    #endif
     
        void Initialize();
        void Release();
        int TestFunction(int _Value);
     
    #if defined (__cplusplus)
    }
    #endif
    #endif

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Bonjour et merci aslo92,

    Je vais réessayer ce que tu me donnes. Il me semblait avoir tester, mais peut-être que non ^^.

    Merci et je vous redis quoi ici.

    @souviron34 :
    Peut-être que je m'explique comme un cancre, mais j'avais quand même compris jusque là:p.

    Je lis mes fichiers dll ou so (bientôt ) grâce à JNA. C'était pour avoir aussi des contre indication de favorise le JNA par rapport JNI.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Rebonjour,
    voilà j'ai refait comme tu m'as montré et je retombe toujours sur l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'myDLL': libmyDLL.so: cannot open shared object file: No such file or directory
    Je mes mon .so tout comme mon .DLL dans le dossier de mon projet.
    Soit c'est bien un problème d'emplacement ou soit c'est un problème dans le fichier .so.
    Si j'ai bien compris aussi, écliarez-moi^^, il faut que je nome mon .so libmyDLL.so , non?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Résolu : Le problème est que JNA va chercher dans usr\lib...
    Pour résoudre le problème sous NetBeans : monproject -> propriété -> RUN et mettre dans ' VM Option' : '-djna.library.path="."' ou mettre le .so dans usr\lib


    Voilà, merci à vous .

Discussions similaires

  1. [Ant] [Ejb] Probléme de création d'ejb avec Genic
    Par rivierem dans le forum JOnAS
    Réponses: 7
    Dernier message: 25/06/2004, 16h21
  2. Réponses: 7
    Dernier message: 16/06/2004, 15h02
  3. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59
  4. Problème de création de fenêtre
    Par tomateauketchup dans le forum DirectX
    Réponses: 1
    Dernier message: 08/06/2003, 19h42
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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