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

Dev-C++ Discussion :

lier une librairie en tant que librairie statique :(


Sujet :

Dev-C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut lier une librairie en tant que librairie statique :(
    bonjour,

    je recherche un moyen de lier statiquement
    la librairie "libmad" (décodeur de flux mpeg audio ^^ )
    a un de mes programmes

    le problème est que bien que le compilateur ne génère
    pas d'erreur lorsque je compile un exemple de code
    ( en incluant "mad.h" ),
    le lieur lui génère l'erreur suivante
    test.cpp:(.text+0xd): undefined reference to `mad_stream_init'
    comme si le lieur cherchait un librairie externe :/

    hors je désire faire une compilation avec libmad intégré dans mon programme
    ( plutôt que d'avoir a compiler la librairie séparément dans une DLL )


    svp pourriez-vous m'aider a résoudre mon problème ?

    merci.


    note : pour info je n'utilise pas dev c++ directement
    j'utilise mingw avec l'editeur "conTEXT"

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    j'ai fait une recherche avec "mad_decoder_init"
    dans les fichiers du repertoire "libmad"
    ( contenant les codes sources de la librairie )

    la recherche a donné:
                   - decode.c
                   - stream.c
                   - decode.h
                   - stream.h
                   - mad.h
    j'ai donc inclus decode.c et stream.c
    ( mad.h etant déjà inclus, et
    decode.h et stream.h étant inclus par decode.c
    je ne les ai pas rajoutés )

    j'ai compilé le programme les messages du lieur
    ont disparu ... remplacés par des messages
    d'erreurs du compilateur


    les voici :

    > Exécution: C:\Program Files\ConTEXT\ConExec.exe "C:\Program Files\ConTEXT\MinGW\TEST.BAT" "C:\Documents and Settings\Administrateur.-\Bureau\madxlib3\test.cpp" "C:\Documents and Settings\Administrateur.-\Bureau\madxlib3\test.exe"


    In file included from C:\Documents and Settings\Administrateur.-\Bureau\madxlib3\test.cpp:21:

    ...libmad\decoder.c: In function `void mad_decoder_init(mad_decoder*, void*, mad_flow (*)(void*, mad_stream*), mad_flow (*)(void*, const mad_header*), mad_flow (*)(void*, const mad_stream*, mad_frame*), mad_flow (*)(void*, const mad_header*, mad_pcm*), mad_flow (*)(void*, mad_stream*, mad_frame*), mad_flow (*)(void*, void*, unsigned int*))':

    ...libmad\decoder.c:76: error: invalid conversion from `int' to `mad_decoder_mode'

    ...libmad\decoder.c: In function `mad_flow error_default(void*, mad_stream*, mad_frame*)':

    ...libmad\decoder.c:299: error: invalid conversion from `void*' to `int*'

    ...libmad\decoder.c: In function `int mad_decoder_run(mad_decoder*, mad_decoder_mode)':

    ...libmad\decoder.c:553: error: invalid conversion from `void*' to `mad_decoder::<anonymous struct>*'
    > Exécution


    voila les lignes de codes corespondantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ligne 76 :
         decoder->mode         = -1;
    ligne 299:
         int *bad_last_frame = data;
    ligne 533:
         decoder->sync = malloc(sizeof(*decoder->sync));

    cela n'a pas marché ... je commence à désespérer :'(

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, attends, c'est pas normal, tu inclus un .c dans un .cpp...

    C'est du code en langage C qui ne compile pas en C++. Tu dois compiler directement les .c
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    aie dommage

    serait-il possible de compiler le code source de libmad
    vers un fichier "liblibmad.a" ( par exemple )
    pour pouvoir ensuite l'importer en tant que librairie ?

    si c'est le cas pourriez-vous m'aider en me montrant la marche a suivre ? ^^



    j'ai aussi d'autres question concernant les librairies :

    j'aimerait savoir si il existe un moyen de lier toute les librairies du repertoire "lib" a mon programme sans pour
    autant en augmenter la taille ?

    lorsque une librairie en .a est incluse est-ce que
    toutes les fonctions exportés qu'elle contient sont
    inserées dans le fichier ?
    ( meme celles que je n'utilise pas ? )




    merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut RANLIB buggé T_T
    bon g trouvé les reponses a mon probleme sur internet...
    mais il ya malheureusement un bug dans RANLIB.EXE :/


    voila le source d'un fichier en .bat :


    %0\..\BIN\GCC.EXE "C:\Documents and Settings\Administrateur.-\Bureau\madxlib3\libmad\mad.h" -o libmad.o

    %0\..\BIN\AR.EXE -rvs libmad.a libmad.o

    %0\..\BIN\RANLIB.EXE libmad.a


    la premiere ligne produit un fichier libmad.o a partir de mad.h

    la deuxieme ligne convertir le fichier libmad.o en libmad.a

    troisieme ligne :
    quand jai essayé de compiler un programme avec le fichier crée a partir des deux lignes precedente, le lieur m'a signalé l'erreur suivante :

    libmad.a: could not read symbols: Archive has no index; run ranlib to add one


    j'ai donc rajouter la troisieme ligne au fichier .bat
    j'ai recompilé la librairie et mon programme ...
    et bien le message d'erreur est toujours la :/

    ranlib.exe a l'air buggé et malheureusement je ne sait pas comment faire pour produire un fichier .a autrement ...


    svp, quelqu'un aurait t'il une solution a me proposé ?


    merci d'avance.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    bonjour

    si ça continue je vais renoncer à GCC moi -_-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     extern "C"
     {
        #include "libmad\mad.h"
        #include "libmad\decoder.c" 
        #include "libmad\stream.c" 
     }
    ne fonctionne pas ...

    * grosse déprime ... *

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Celui qu'on ne lit pas
    Euh, attends, c'est pas normal, tu inclus un .c dans un .cpp...

    C'est du code en langage C qui ne compile pas en C++. Tu dois compiler directement les .c
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut probleme resolu ... grace a du bidouillage ^^;
    voila je respire .. enfin :]

    j'ai crée un fichier "mad.h" dans un autre dossier
    contenant une reference a tout les fichier .h et .c
    ( sauf minimad.c ) presents dans le repertoire de libmad
    et g compilé ( sur le coup cela n'a pas marché )

    alors j'ai eu l'idée de rajouter -x c et la ca a marché,
    les compilations de "libmad.a" puis de "test.cpp" ont reussies ^^

    d'ailleur un test de "nm.exe" signale que toute les fonction sont presente ( sauf alloc et consort evdiamment )

    dommage que l'on ne m'ai pas beaucoup aidé
    pour trouver cette solution :/

    ++

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parce que normalement, c'est censé marcher sans bidouillage.
    • Tu compiles les .c,
    • Tu tu compiles les .cpp (au besoin en mettant extern "C" {} autour des .h)
    • Et tu linkes le tout.
    Et là, normalement, ça marche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [XSD] Pourquoi une URL en tant que XML NameSpace ?
    Par Bayard dans le forum Valider
    Réponses: 2
    Dernier message: 11/12/2006, 11h06
  2. Passage d'une fonction en tant que paramètre
    Par bagnolm dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2006, 15h58
  3. Une bibliographie en tant que chapitre non numéroté
    Par Kurisu dans le forum Bibliographies - Index - Glossaires
    Réponses: 1
    Dernier message: 18/10/2006, 20h52
  4. utilisation d"une variable en tant que motif de
    Par bilout dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2006, 20h19
  5. [FTP] Définir une variable en tant que constante
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2006, 11h39

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