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

Code::Blocks Discussion :

Problème : création de bibliothèque et utilisation


Sujet :

Code::Blocks

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut Problème : création de bibliothèque et utilisation
    Bonjour j'ai un problème avec la création du librairie sous code::blocks.

    Donc je fait :
    File -> New Project -> Static library
    Je laisse le tout par défault je compile.

    Ensuite je fait File -> New Project -> Console Application
    je laisse tout par défaut.
    je rajoute une ligne pour avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
        int a = SampleAddInt(10,10);
        std::cout << "Hello world!" << std::endl;
        return 0;
    }
    Ensuite je fait un clique droit Console Application ( dans l'explorateur de projet ) -> Build option -> Linker -> Add ( je cherche la mon fichier ) -> ouvrir -> non -> Ok -> ok



    et quand je compile j'obtient :

    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\cpp\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.cpp
    Linking console executable: C:\cpp\console.exe
    .objs\main.o(.text+0x13a):main.cpp: undefined reference to `SampleAddInt(int, int)'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    1 errors, 0 warnings
    merci de votre aide
    Images attachées Images attachées  

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Bonjour j'ai un problème avec la création du librairie sous code::blocks.
    Tu as l'air de vouloir lier avec une bibliothèque. Quand tu fais "Build option -> Linker -> Add ( je cherche la mon fichier ) -> ouvrir -> non -> Ok -> ok", c'est pour lier ton fichier avec une bibliothèque DEJA existante, pas pour en créer une.

    Sinon, ton erreur vient également du fait que la fonction n'est jamais défini. Il te faudrait peut être un .h pour mettre le prototype.

    Lorsque tu crée une bibliothèque, tu donnes un fichier .a (pour permettre l'édition des liens), un fichier .dll (je parle sous windows) et des fichiers d'entête .h (pour permettre la compilation)
    Je ne répondrai à aucune question technique en privé

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    je fait une librairie statique.

    j'ai rajouter des .h

    Pour mon projet static librairie :
    dll.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int SampleAddInt(int,int);
    sample.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "dll.h"
    int SampleAddInt(int i1, int i2)
    {
        return i1 + i2;
    }
    Mon projet console Application
    dll.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int SampleAddInt(int,int);
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <iostream>
    #include "dll.h"
    int main()
    {
        int a = SampleAddInt(10,10);
        std::cout << "Hello world!" << std::endl;
        return 0;
    }
    Mais j'obtient toujours le même message d'erreur alors que je link bien la librairie.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    A mon avis, tu devrais essayer de faire une dynamic library qui te génère le .a et le .dll à la fois. Il te montrera qu'il y a des macros spéciales :

    Dans le .h, il faudra mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
     
    void DLL_EXPORT mafonction();
    Je ne répondrai à aucune question technique en privé

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Je viens de faire comme tu me l'as dit :
    j'obtient pour la dll ce log :
    Project : Static library
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dll\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: sample.c
    Linking dynamic library: staticlib.dll
    Creating library file: libstaticlib.a
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings


    Ensuite, je met la dll dans le repertoire de compilation de console Application
    Je link le fichier libstaticlib.a.
    J'obtient ce log :
    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\cpp\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.cpp
    Linking console executable: C:\cpp\console.exe
    .objs\main.o(.text+0x13a):main.cpp: undefined reference to `_imp___Z12SampleAddIntii'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 0 warnings



    Pourtant j'ai bien mis
    console application fichier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int __declspec(dllimport) SampleAddInt(int,int);
    dans le fichier.h de la librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int __declspec(dllexport) SampleAddInt(int,int);

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    oui, ça c'est parce que tu compiles avec g++ je viens de penser, il faut mettre:

    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
    #ifdef __cplusplus
    extern "C" {
    #endif
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
     
    int DLL_EXPORT f(int i);
     
    #ifdef __cplusplus
    }
    #endif
    // a sample exported function
    Dans ce cas, j'ai testé chez moi, ça marche bien
    Je ne répondrai à aucune question technique en privé

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    ok merci donc si je comprend bien

    pour ma dll le .h devient.
    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
     
    #define BUILD_DLL
    #ifdef __cplusplus
    extern "C" {
    #endif
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
     
    int DLL_EXPORT SampleAddInt(int i1, int i2);
     
    #ifdef __cplusplus
    }
    #endif
    et la .h pour mon application devient :
    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
     
    #define BUILD_DLL
    #ifdef __cplusplus
    extern "C" {
    #endif
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
     
    int DLL_EXPORT SampleAddInt(int i1, int i2);
     
    #ifdef __cplusplus
    }
    #endif
    Merci de ton aide sinon...

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    En fait, BUILD_DLL est automatiquement défini lors de la compilation de la bibliothèque sous code::blocks. Donc il n'y a pas à faire de #define BUILD_DLL.

    Pour ton projet de DLL, si pourras constater que si tu édites les options de compilation de ton projet, dans #define, tu auras BUILD_DLL qui est automatiquement mis. Donc pas besoin de l'ajouter dans le fichier
    Je ne répondrai à aucune question technique en privé

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Ok merci de ton aide. Ca marche parfaitement...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création de nouvelle bibliothèque en utilisant sfunction
    Par sarah2323 dans le forum Simulink
    Réponses: 1
    Dernier message: 05/05/2014, 12h04
  2. Problème création et destruction de processus.
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 08/04/2005, 13h33
  3. Pb création diagramme : bibliothèque non inscrite
    Par jeff37 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/08/2004, 16h38
  4. Problèmes création de procédures et de triggers
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 06/11/2003, 10h42
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

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