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 :

C et xml avec libxml2


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut C et xml avec libxml2
    Bonjour,
    Je travaille sous windows sur une appli en C qui sert à extraire des trames xml .
    J'utilise MinGW , MSYS pour la compilaton et les librairies libxml2 , zlib et iconv
    J'ai fait tous les liens de librairie dans Eclipse , rajouter les dll dans le system,et modifier le path pour accéder aux librairies etc.
    Mais j'ai une erreur :
    undefined reference to _imp__xmlFree.
    Si à la compil je rajoute -DLIBXML_STATIC l'erreur est:
    undefined reference to xmlFree.
    J'ai vu que la question avait déjà été posée mais je n'ai vu aucune réponse qui corrige mon problème.
    Je remercie d'avance celui qui pourra me filer un coup de main .Ca fait 2 jours que je suis dessus.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Pourrais-tu déjà vérifier que tu n'as pas de warnings auparavant te disant qu'il ne trouve pas la fonction xmlFree ?

    Ensuite quelle DLL utilises-tu ? Personnellement, chez moi, j'ai recompilé la librairie avec MinGW pour ne pas avoir de problème.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Désolé de ne pas avoir repris la conversation tout de suite (pause dejeuner)
    Voilà le message à la compilation:
    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
    **** Build of configuration Debug for project Test_Lib ****
     
    mingw32-make all 
    'Building file: ../test_lib.c'
    'Invoking: GCC C Compiler'
    mingw32-gcc -I"C:\LIBXML2\libxml2-2.6.28.win32\include" -I"C:\LIBXML2\iconv-1.9.2.win32\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test_lib.d" -MT"test_lib.d" -o"test_lib.o" "../test_lib.c"
    'Finished building: ../test_lib.c'
    ' '
    'Building target: Test_Lib.exe'
    'Invoking: GCC C Linker'
    mingw32-gcc -L"C:\LIBXML2\libxml2-2.6.28.win32\lib" -o"Test_Lib.exe"  ./test_lib.o   -llibxml2
    ./test_lib.o(.text+0x2a0): In function `main':
    C:/IDE/eclipse/eclipse/workspace/Test_Lib/Debug/../test_lib.c:68: undefined reference to `_imp__xmlFree'
    mingw32-make: *** [Test_Lib.exe] Error 1
    Build complete for project Test_Lib
    Ensuite pour les dll j'ai iconv libxml2 zlib1 libiconv2 que j'ai mises dans c:\Windows\system

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Hum... pas de warnings. Tu n'as qu'un fichier ? Dans ce cas, peux-tu me l'envoyer que je teste avec mon installation de libxml2.

    Ta libxml2 n'a pas été générée avec Visual C++ ? Il y a parfois des problèmes de compatibilité.

    J'ai regardé ce que j'avais chez moi. Je compile donc une librairie (du boulot) avec xmlFree (tu pourrais utiliser à la place xmlFreeDoc ou autres) sous MinGW et je n'ai pas le problème.

    Il est vrai que le problème du xmlFree est assez récurrent.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    C'est un code que j'ai pris sur le tuto de la libxml2 pour voir si tout fonctionnait.
    http://xmlsoft.org/tutorial/apd.html
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <libxml\parser.h>
    #include <libxml\xpath.h>
     
    xmlDocPtr
    getdoc (char *docname) {
    	xmlDocPtr doc;
    	doc = xmlParseFile(docname);
     
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return NULL;
    	}
     
    	return doc;
    }
     
    xmlXPathObjectPtr
    getnodeset (xmlDocPtr doc, xmlChar *xpath){
     
    	xmlXPathContextPtr context;
    	xmlXPathObjectPtr result;
     
    	context = xmlXPathNewContext(doc);
    	if (context == NULL) {
    		printf("Error in xmlXPathNewContext\n");
    		return NULL;
    	}
    	result = xmlXPathEvalExpression(xpath, context);
    	xmlXPathFreeContext(context);
    	if (result == NULL) {
    		printf("Error in xmlXPathEvalExpression\n");
    		return NULL;
    	}
    	if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
    		xmlXPathFreeObject(result);
                    printf("No result\n");
    		return NULL;
    	}
    	return result;
    }
    int
    main(int argc, char **argv) {
     
    	char *docname;
    	xmlDocPtr doc;
    	xmlChar *xpath = (xmlChar*) "//keyword";
    	xmlNodeSetPtr nodeset;
    	xmlXPathObjectPtr result;
    	int i;
    	xmlChar *keyword;
     
     
    	if (argc <= 1) {
    		printf("Usage: %s docname\n", argv[0]);
    		return(0);
    	}
     
     
    	docname = argv[1];
    	doc = getdoc(docname);
    	result = getnodeset (doc, xpath);
     
    	if (result) {
    		nodeset = result->nodesetval;
    		for (i=0; i < nodeset->nodeNr; i++) {
    			keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
    		printf("keyword: %s\n", keyword);
    		xmlFree(keyword);
     
    		}
    		xmlXPathFreeObject (result);
     
    	}
    	xmlFreeDoc(doc);
    	xmlCleanupParser();
    	return (1);
    }
    Pour l'instant j'arrive avec un autre code à récupérer les nodes et à les afficher sans utiliser xmlFree mais avec xmlFreeDoc :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdio.h>
    #include <string.h>
    #include <tree.h>
    #include <xpath.h>
    #include <fcntl.h>
    #include <libxml/parser.h>
    #include <stdlib.h>
     
    #define FICHIER "C:/IDE/trames/trame_gyro.xml"
     
    #ifdef LIBXML_TREE_ENABLED
     
    /**
     * print_element_names:
     * Ecrit le nom de chaque element xml
     * qui sont parents ou enfants d un node donné.
     */
     
     
    static void print_element_names(xmlNode * a_node)
    {
        xmlNode *cur_node = NULL;
     
        for (cur_node = a_node; cur_node; cur_node = cur_node->next) 
        {
            if (cur_node->type == XML_ELEMENT_NODE) 
            {
                printf("node type: Element, name: %s\n", cur_node->name);
            }
     
            print_element_names(cur_node->children);
        }
    }
     
     
    int
    main()
    {
        xmlDoc *doc = NULL;
        xmlNode *root_element = NULL;
     
        LIBXML_TEST_VERSION
     
        doc = xmlReadFile((char *)FICHIER, NULL, 0);
     
        if (doc == NULL) 
        {
            printf("error: could not parse file %s\n", FICHIER);
        }
     
        root_element = xmlDocGetRootElement(doc);
     
        print_element_names(root_element);
     
        xmlFreeDoc(doc);
     
        xmlCleanupParser();
     
        return 0;
    }
     
    #else
    int main(void) {
        fprintf(stderr, "Tree support not compiled in\n");
        exit(1);
    }
    #endif
    et un exemple de fichier xml dont je vais devoir récupérer les éléments,les attributs et leur valeur pour effectuer une conversion au format NetCDF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <message name="typicalGyro" major="1" minor="0" deviceid="PP_PHINS">  
    <gyro acquisitiontime="039315.3096746">
    <head>000.00</head>
    </gyro>
    </message>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Ta libxml2 n'a pas été générée avec Visual C++ ? Il y a parfois des problèmes de compatibilité.
    Je n'ai pas VisualC++.
    J'ai télécharger libxml2-2.6.28.win32 et iconv en zip sur http://xmlsoft.org/sources/win32/
    Ensuite je les ai dézipper et j'ai juste ajouté les dll dans le system et les librairies libxml2 et iconv au programme sous Eclipse

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Voilà comment j'ai compilé ton premier fichier avec mon installation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -I/usr/local/include/libxml2 -L/usr/local/lib/ -o xml xml.c -lxml2
    et sous Linux (mais ça ne doit pas t'intéresser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -I/usr/include/libxml2/ -o xml xml.c -lxml2
    Aucun problème. Vérifie si ça fait pareil chez toi (aux chemins près).

    J'ai remarqué que ça marchait mieux en compilant soit même la libxml2 mais je ne me suis jamais trop penché sur le problème. Mon client utilise des binaires win32 de la libxml2 (téléchargés sur le Net et qui s'appuie en particulier sur iconv) et il n'a jamais rencontré ce problème. Je doute de plus en plus de ton installation.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Bon je te remercie ,là ,c'est la fin de semaine .Je dois partir.
    Je reviendrai sur le sujet et testerai ta ligne de commande .Bon week-end

  9. #9
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Je ne sais pas si ça peut t'aider mais avec gcc je compile en passant ces arguments :
    gcc `xml2-config --cflags --libs`

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Voilà comment j'ai compilé ton premier fichier avec mon installation.
    Code :

    gcc -Wall -I/usr/local/include/libxml2 -L/usr/local/lib/ -o xml xml.c -lxml2
    Tu m'as envoyé 2 lignes de compilation et je ne vois pas comment utiliser celle-ci sous windows alors j'ai essayé de compiler avec MSYS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -Wall -I"c:/LIBXML2/libxml2/include" -I"c:/LIBXML2/iconv/include" -o test_lib test_lib.c -L"c:/LIBXML2/libxml2/lib" -llibxml2
    je n'ai pas de librairie xml2 j'ai juste libxml2, je ne peux donc pas compiler avec : "-lxml2"
    En tout cas l'erreur est toujours la même .Est-ce qu'il me manque une librairie ou une dll?
    Et question de novice: que signifie la ligne de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc `xml2-config --cflags --libs`

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    je n'ai pas de librairie xml2 j'ai juste libxml2, je ne peux donc pas compiler avec : "-lxml2"
    Non, justement quand on dit -lxml2, c'est qu'on désire compiler avec libxml2. Par convention, les noms des librairies doivent commencer par lib. On restreint donc libxml2 à xml2.

    En tout cas l'erreur est toujours la même.
    Envoie la trace. Ca ne fait pas de mal.

    Et question de novice: que signifie la ligne de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc `xml2-config --cflags --libs`
    xml2config est un utilitaire qui te donne les flags de compilation et de link à utiliser avec la librairie xml2. Il est vrai que tu pourrais réduire ta ligne de commande à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -o xml xml.c `xml2-config --cflags --libs`
    Redis-nous ce que ça donne et envoie les traces.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Je viens de jeter un coup d'oeil sur les binaires dont tu parlais.
    Il traîne des msvc dans la librairie statique. Je crains que ces librairies aient été compilées avec Visual C++. Dans ce cas, pour les utiliser avec MinGW, il vaut mieux plutôt faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -I<include> -o xml xml.c <lib>/libxlm2.lib
    Mais je retombe sur le même problème que toi.
    Et quand on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nm libxml2.lib | grep _imp__xmlFree
    on n'a rien alors que pour la DLL que j'ai compilé, on obtient bien quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    00000000 I __imp__xmlFree
    ce qui veut dire que le symbole qu'il te manque existe dans ma DLL mais pas dans la tienne.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Ma ligne de compilation sous MSys:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -I"c:/LIBXML2/libxml2/include" -I"c:/LIBXML2/iconv/include" 
    -DLIBXML_STATIC -o test_lib test_lib.c -L"c:/LIBXML2/libxml2/lib" -llibxml2
    la console me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C:/DOCUME~1/gd/LOCALS~1/Temp/cceObaaa.o(.text+0x2a3):test_lib.c:
     undefined reference to `xmlFree'
    et sans "-DLIBXML_STATIC" : "undefined reference to _imp__xmlFree"
    Je n'ai pas de warning me disant "implicit declaration of xmlFree".
    Est-ce que c'est bien ce que tu demandes en parlant de traces

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Oui c'est des bonnes traces même si elle ne donne pas ce qu'on veut.
    Tu as lu ma dernière remarque à la fin.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    on n'a rien alors que pour la DLL que j'ai compilé, on obtient bien quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    00000000 I __imp__xmlFree
    Qu'est-ce que ça signifie?

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    I veut dire que le symbole __imp__xmlFree est une référence indirecte vers un autre symbole. Le premier chiffre correspond à la valeur du symbole mais comme c'est une référence indirecte, il vaut 00000000.
    Bref, ça veut dire que la fonction _imp__xmlFree est bien dans la librairie.
    Dans ton cas, il n'y a pas de telle ligne. Bon, après j'ai regardé avec la version 2.6.23 et pas 2.6.28 mais ça devrait être pareil.

    C'était un problème connu chez xmlsoft que je croyais résolu mais apparemment leur compilation win32 de la libxml2 connaît toujours ce problème. A moins qu'il y ait une astuce mais là, je ne vois pas...

    Le souci ne se pose pas quand tu compiles toi-même avec MinGW.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Le symbole qui n'est pas dans ma dll libxml2.dll n'était dans aucune des autres versions libxml2 que j'ai téléchargées .
    Je vais télécharger libxml2 depuis une autre source si j'en trouve une et je vais réessayer.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Le souci ne se pose pas quand tu compiles toi-même avec MinGW.
    Il faut que je compile quoi pour obtenir la dll et les librairies de libxml2?
    J'ai retéléchargé une autre version 2.6.27 et j'essaie de faire ce qu'il y a dans le readme de libxml2-2.6.27/win32 en commençant par configurer le source mais mon ordi ne prend pas en compte le format .js donc c'est pas le top pour le configure.js.

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Download ftp://fr.rpmfind.net/pub/libxml/libxml2-2.6.30.tar.gz
    tar xzvf libxml2-2.6.30.tar.gz
    cd libxml2-2.6.30
    ./configure --prefix=<installdir> # C'est bon quand les Makefiles sont générés
    make
    make install
    As-tu besoin de zlib ou de iconv ?

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ./configure --prefix=<installdir>
    sh: syntax error near unexpected token `--prefix=<installdir>'
    il a bien extrait les fichiers mais je ne parviens pas à faire le ./configure.
    Excuse-moi mais je ne comprends pas le prefix=<installdir>

    Pour ce qui est de zlib et iconv je les ai et il devrait fonctionner ,je te remercie.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment valider un XML via un XSD en C++ (avec libXML2) ?
    Par blastobi dans le forum Télécharger
    Réponses: 0
    Dernier message: 10/01/2012, 16h22
  2. [XSD][xerces] validation xml avec un xsd
    Par chand_bing dans le forum Valider
    Réponses: 2
    Dernier message: 05/02/2004, 20h21
  3. [XML][XSL][FOP] transformation xml avec fop
    Par Le Marlou dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/12/2003, 16h58
  4. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  5. generer xsl depuis xml avec balises inconues ?
    Par cedre dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 24/06/2003, 09h00

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