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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Invité de passage
    Profil pro
    Inscrit en
    Février 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 1
    Par défaut
    J'ai un soucis avec libxml2 sous linux, avec mingw...
    Citation Envoyé par aoyou Voir le message
    Ensuite quelle DLL utilises-tu ? Personnellement, chez moi, j'ai recompilé la librairie avec MinGW pour ne pas avoir de problème.
    Cela m'interesserait beaucoup de savoir comment recompiler libxml2 avec mingw, sous linux

  9. #9
    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 ne comprends pas ta question...

    Mingw, c'est uniquement sous Windows (à moins que tu cross-compiles).

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

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