Partage
  • Partager sur Facebook
  • Partager sur Twitter

"Inclure un fichier dll"

Ide codeblocks

    4 juillet 2007 à 0:19:40

    Bonjour !

    J'utilise l'IDE codeblocks sous windows.

    Je l'ai utilisé pour faire un fichier dll tout bête contenant une fonction :
    #include <iostream>
    #include <string>

    using namespace std;

    string combiner(string a, string b) //Cette fonction retourne la combinaison des chaines a et b
    {
            return a + b;
    }
     

    => Compilé en Combiner.dll

    et un autre :
    #include <string>

    using namespace std;

    string inverser(string str) //Cette fonction retourne la chaine str inversée
    {
        int longueur = str.size();
        string out ="";

        for( int i = longueur - 1 ; i<=0 ; i-- )
            out += str[i];

        return out;
    }

     

    =>Compilé en Inverser.dll


    Maintenant je voudrais les exploiter dans un projet :
    #include <iostream>
    #include <string>

    using namespace std;
    string inverser(string str);
    string combiner(string a, string b);

    int main()
    {
            string a,b;

            cout << "Entrez la chaine a : ";
            cin >> a;
            cout << "Entrez la chaine b : ";
            cin >> b;

            cout << endl;
            cout << "Inversion de a : " << inverser(a) << endl;
            cout << "Inversion de b : " << inverser(b) << endl;
            cout << "Combinaison de a et b : " << combiner(a,b) << endl;
        cout << "Inversion de 'a combine a b' : " << inverser(combiner(a,b)) << endl;       return 0;
    }
     

    Je voudrais donc "inclure" ( je sais pas si c'est le terme ) les dll à mon projet car là j'ai une erreur à la compilation :
    :: === Exploitation, Release ===
    obj\Release\main.o:main.cpp:(.text+0x13c):: undefined reference to `inverser(std::string)'
    obj\Release\main.o:main.cpp:(.text+0x216):: undefined reference to `inverser(std::string)'
    obj\Release\main.o:main.cpp:(.text+0x33c):: undefined reference to `combiner(std::string, std::string)'
    obj\Release\main.o:main.cpp:(.text+0x4a9):: undefined reference to `combiner(std::string, std::string)'
    obj\Release\main.o:main.cpp:(.text+0x4cc):: undefined reference to `inverser(std::string
    :: === Build finished: 5 errors, 0 warnings ===

    ( normal vu que les fonction combiner et inverser lui sont inconnues, il trouve le prototype mais pas la déclaration )

    Je voudrais savoir donc comment inclure mes dlls au projet pour qu'il puisse compiler et surtout qu'il n'insère pas le code des dll dans le .exe mais qu'il fasse un .exe qui a besoin de ces deux dll pour fonctionner ( je sais ça n'a aucun interet mais c'est pour apprendre ^^ )

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2007 à 10:19:03

      Si tu veux faire une liaison statique :

      - Tu as un fichier .a qui a du sortir avec tes .dll à la compilation, il suffit de le lier à ton projet final pour compiler. Inconvénient : cela nécessite que tu recompiles ta bibliothèque ET ton programme si tu veux modifier la fonction de ta bibliothèque.

      Si tu veux faire une liaison dynamique :

      - Tu places la spécification __declspec(dllexport) dans ta définition de fonction dans tes 2 bibliothèques.
      string __declspec(dllexport) maFonction()
      {
      }
      Tu places ces .dll dans le dossier de ton projet final, et tu les charges à l'aide de LoadLibrary(). Pour importer une fonction, tu utilises ensuite des pointeurs sur fonction que t'initialises avec GetProcAddress(). Ne pas oublier de spécifier __declspec(dllimport) dans ton projet final les fonctions que tu voudras importer.

      PS : une DLL en C++ ça me parait bizarre, c'est pas pour rien que Code::Blocks ne te propose qu'un projet C lors de sa création.
      • Partager sur Facebook
      • Partager sur Twitter
        4 juillet 2007 à 14:28:51

        Okay merci beaucoup pour ta réponse !

        J'ai bien capté la première méthode mais j'ai pas tout compris pour la deuxième...

        Si je veux faire une liaison dynamique, on va dire d'une fonction int doubler(int)

        Dans mon fichier bibli.c qui va être compilé en dll je mets :

        int __declspec(dllexport) doubler(int x)
        {
          return 2*x;
        }
         
        => compilé en MaLib.dll

        et ensuite dans mon projet je mets :

        LoadLibrary("MaLib.dll");
        int __declspec(dllimport) doubler(int) = GetProcAddress();
         

        C'est ça ?


        Sinon j'ai essayé avec l'inclusion "statique", j'ai l'impression que c'est tout de même bien dynamique ( si je peux dire lol ), j'ai linké les .a générés en même temps que mes dlls, ça a compilé sans problème, et à l'execution il m'a dis que les dll étaient manquantes, donc je les ai placées avec le .exe et là tout fonctionne, j'ai changé le comportement d'une des dll et je l'ai remplace dans mon projet, et le comportement du .exe a changé sans besoin de recompiler, je pense donc que dans les .a générés, il y a le code que tu m'as donné pour l'inclusion dynamique non ?

        PS : Ah oui sinon pour l'histoire de C++, je pense que ça marche puisque dans mes dll il y a bien du code C++, j'utilise la class string avec les méthode operator+=, operator[] et size(), donc tu peux aparament compiler des dlls en C++ sans problème.
        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2007 à 16:25:38

          Pour les fonctions LoadLibrary et GetProcAddress, il faut que tu ailles lire la MSDN, histoire que ce soit pas les autres qui fassent tout le boulot pour toi. Va voir aussi la notion de pointeur sur fonction.
          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2007 à 23:32:41

            Moi je veux bien mais c'est quoi la MSDN ?
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2007 à 8:57:57

              Le MSDN est la source à connaitre lorsqu'on programme pour Windows.

              Le MSDN
              • Partager sur Facebook
              • Partager sur Twitter
              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

              "Inclure un fichier dll"

              × 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.
              • Editeur
              • Markdown