libxml2 mit einem programm [SOLVED]



  • hallo,

    ich hoff ich bin im richtigen forum gelandet....

    also:
    compiler gcc 3.3.4 unter linux.
    ich verwend in einer "xml_reader.c" die libxml2 usw... dh: dort hab ich einige funktionen ausprogrammiert (sind in der xml_reader.h definiert) und verwende auch libxml funktionen.
    ich möchte nun wissen, wie ich das am besten in einem programm von mir verwenden kann.
    mit

    gcc -Wall -o xml_reader `xml2-config --cflags` xml_reader.c `xml2-config --libs`
    

    konnte ich das programm compilen -> es hatte beim testen eine main funktion.
    nun möchte ich aber meine andere datei "blabla.c" compilen. diese hat included die xml_reader.h und sollte so auf die dort definierten funktionen zugreifen können.

    ich denke es sollte so sein:
    xml_reader.c mit libxml gelinkt als eine .o datei compiled

    gcc -Wall -c `xml2-config --cflags`xml_reader.c `xml2-config --libs`
    ergibt:
    gcc: -lxml2: linker input file unused because linking not done
    gcc: -lz: linker input file unused because linking not done
    gcc: -lpthread: linker input file unused because linking not done
    gcc: -lm: linker input file unused because linking not done
    

    kann mir bitte jemand sagen, wie ich das richtig compilen kann... -> ich denke das schreib ich dann einfach in mein Makefile

    danke im voraus!



  • Folgender Befehl `xml2-config --libs` sagt dem Compiler ja, welche Librarys er linken soll. Da du mit der -c-Option aber linken unterbindest (du willst ja Objektdateien haben), verwirft der Compiler die Optionen, was er mit den entspr. Warnungen quitiert.

    Das `xml2-config --libs` musst du erst angeben, wenn du dann wirklich linkst (also die *.o-Dateien zusammenfügst).



  • hi!

    also ich muss auch von der "blabla.c" eine .o erzeugen und dann "zusammenlinken"

    wie kann ich aber xml_reader.o und meine blabla.c gemeinsam compilen? hättest da bitte ein beispiel?

    danke!



  • Im Endeffekt machst du doch so etwas:

    > gcc -c xml_reader.c `xml2-config --cflags`
    > gcc -c foo.c
    > gcc foo.o xml_reader.o
    

    Der letzte Schritt ist das linken, da musst du dann `xml2-config --libs` hinzufügen.



  • jo, das hätt ich auch geglaubt, aber, wenn ich meine "blabla.c" compilen will krieg ich:
    xml_reader.h:5: error: syntax error before "doc"
    xml_reader.h:6: error: syntax error before "doc"
    xml_reader.h:7: error: syntax error before "doc"

    doc is ein xmlDocPtr -> also von libxml2

    thx



  • mach folgendes

    > gcc -c xml_reader.c `xml2-config --cflags`
    > gcc -c foo.c `xml2-config --cflags`
    > gcc foo.o xml_reader.o
    

    Zur not benutz folgendes Makefile und ersetz CXXFLAGS:= durch CXXFLAGS:=`xml2-config --cflags` und LIBS:= mit LIBS:=`xml2-config --libs` 🙂



  • hi,

    das mit deinem Makefile wär cool, aber jetzt krieg ich:
    make: Nothing to be done for `all'.

    das Makefile:

    RGET   :=./eth_chooser
    CXXFLAGS :=-ansi -Wall `xml2-config --cflags`
    CXX      :=gcc
    LIBS     :=`xml2-config --libs`
    EXT      :=c
    
    SOURCES  :=$(wildcard *.$(EXT))
    OBJECTS  :=$(patsubst %.$(EXT),%.o,$(SOURCES))
    DEPS     :=$(patsubst %.$(EXT),%.dep,$(SOURCES))
    
    all: $(TARGET)
    
    $(TARGET): $(OBJECTS) $(DEPS)
            $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
    
    -include $(DEPS)
    
    %.o: %.$(EXT)
            $(CXX) $(CXXFLAGS) -c $< -o $@
    
    %.dep: %.$(EXT)
            $(CXX) $(CXXFLAGS) -MM $< -MT $(<:.$(EXT)=.o) > $@
    
    .PHONY: clean
    clean:
            rm -f $(TARGET) $(OBJECTS) $(DEPS)
    

    natürlich mit tabs usw richtig....
    hab natürlich auch g++ und cpp auf gcc bzw. c geändert

    die verzeichnisstruktur:

    config.xml
    blabla.h
    xml_reader.dep
    blabla.h
    xml_reader.h
    Makefile
    eth_chooser.dep
    xml_reader.c
    xml_reader.o
    

    danke im voraus!



  • schau mal in die erste Zeile, das sollte TARGET heißen!



  • hi!

    ja, danke!

    1. war target falsch
    2. hatte ich die libxml/xmlreader.h in der xml_reader.c eingebunden, aber nicht in der xml_reader.h! daher konnte der aufruf durch eine andere klasse ja nichts von libxml/xmlreader.h wissen 🙂

    jetzt gehts!

    thx


Anmelden zum Antworten