kann mir jemand bei einem makefile helfen?



  • ich habe ein neuronales netz geschrieben, und weil es recht groß geworden ist, wollte ich die klassen in einige dateien auftrennen.
    vorhanden sind nun:

    neuron.h
    layer.h
    global_fkt.h
    annet.h
    main.cpp

    die klassen besitzen verschiedene abhängigkeiten...
    neuron.h besitzt die klassen neuron und axon und ist von layer abhängig.
    layer ist von neuron abhängig und annet von beiden. (ich kapsele klassen normalerweise schon immer, aber hier ist es nicht schlecht wenn die in der der art aufbauen...)

    nun wollte ich ein makefile machen, habe aber keine ahnung wie...
    das war mein versuch, aber scheint nicht sonderlich gut zu klappen.
    kann mir da jemand weiterhelfen? ich nutze linux und gcc als compiler.

    CC = /usr/bin/gcc
    LD = ld
    
    prog: annet.obj layer.obj neuron.obj global.obj main.obj
    	$(LD) -o NET annet.obj layer.obj neuron.obj global.obj main.obj
    
    annet.obj: annet.h
    	$(CC) -c annet.h
    
    layer.obj: layer.h
    	$(CC) -c layer.h
    
    neuron.obj: neuron.h
    	$(CC) -c neuron.h
    
    global.obj: global.h
    	$(CC) -c global.h
    
    global.obj: main.cpp
    	$(CC) -c main.cpp
    


  • http://www.google.de/search?hl=de&q=make&btnG=Google-Suche&meta=

    Ansonsten solltest du beim GNU-make peinlichst genau darauf achten, dass die "Compile-Zeilen" mit einem TAB und NICHT mit Leerzeichen eingerückt sind. Ggf. musst du hier die Einstellungen deines Texteditors bearbeiten.

    Statt gcc solltest du direkt mit g++ arbeiten. ld benötigst du in diesem Falle ja auch nicht seperat.

    Deine Dateistruktur solltest du auch noch mal überdenken. Headerdateien solltest du nicht übersetzen, da diese (wahrscheinlich) direkt in die main.cpp eingebunden werden und mit dieser zu Objektdatei verwurstet werden.

    myprog: main.cpp main.hpp foo.hpp
        g++ -o myprog main.cpp
    

    Für die Klasse wie folgt:

    myclass.o: myclass.cpp myclass.hpp
        g++ -c myclass.cpp
    

    das war mein versuch, aber scheint nicht sonderlich gut zu klappen.

    Und was ist das für eine Fehlerbeschreibung? Genau, gar keine.

    Grüße... Heiko





  • also das bekomme ich wenn ich zb. das gepostete makefile benutze. (also das im link)

    make
    g++ -g -W -Wall -Wno-long-long -pedantic -std=c++98 -c annet.cpp -o build/annet.o
    annet.cpp: In constructor ‘annet::annet(short unsigned int, short unsigned int*, short unsigned int*, short unsigned int, float)’:
    annet.cpp:44: error: invalid use of incomplete type ‘struct axon’
    neuron.h:9: error: forward declaration of ‘struct axon’
    annet.cpp:49: error: invalid use of incomplete type ‘struct axon’
    neuron.h:9: error: forward declaration of ‘struct axon’
    annet.cpp: At global scope:
    annet.cpp:12: warning: unused parameter ‘range_rand’
    annet.cpp: In function ‘float annet::* run_annet(float*)’:
    annet.cpp:68: error: ‘n_annet’ was not declared in this scope
    annet.cpp:73: error: ‘n_of_layers’ was not declared in this scope
    annet.cpp:77: error: ‘n_annet’ was not declared in this scope
    annet.cpp:131: error: ‘n_annet’ was not declared in this scope
    annet.cpp:131: error: ‘n_of_layers’ was not declared in this scope
    annet.cpp: At global scope:
    annet.cpp:137: warning: unused parameter ‘eingabe’
    make: *** [build/annet.o] Fehler 1
    

    dh. das variablen die in der header stehen nicht von cpp gefunden werden. und außerdem meckert er wegen predeklarationen in den headern.



  • habe ein paar strukturierungsfehler noch beseitigt...

    Hasu@linux-fizf:~/annet_0.3> make
    g++ -g -W -Wall -Wno-long-long -pedantic -std=c++98 -MM annet.cpp -MT build/annet.dep -MT annet.o -o build/annet.dep
    g++ -g -W -Wall -Wno-long-long -pedantic -std=c++98 -c annet.cpp -o build/annet.o
    annet.cpp:13: warning: unused parameter ‘range_rand’
    annet.cpp: In function ‘float annet::* run_annet(float*)’:
    annet.cpp:69: error: ‘n_annet’ was not declared in this scope
    annet.cpp:74: error: ‘n_of_layers’ was not declared in this scope
    annet.cpp:78: error: ‘n_annet’ was not declared in this scope
    annet.cpp:132: error: ‘n_annet’ was not declared in this scope
    annet.cpp:132: error: ‘n_of_layers’ was not declared in this scope
    annet.cpp: At global scope:
    annet.cpp:138: warning: unused parameter ‘eingabe’
    make: *** [build/annet.o] Fehler 1
    

    problem (zumindest bei diesem objekt) sind nicht gefundene varialen



  • schau dir mal CMake an. www.cmake.org und du wirst der Krankheit: "Makefile selber basteln" befreit sein 🙂 (v.a., weil CMake plattforumunabhängig ist)



  • @dgrat
    Dabei wird es sich einfach um Fehler in deinem Code handeln.

    @muffmolch
    CMake finde ich nicht so überzeugend. Ich habe es eine Zeit lang benutzt und auf einmal war es nicht mehr möglich mit statischen Libs zu arbeiten.

    Da würde ich eher WAF empfehlen.



  • habs gefunden



  • rüdiger schrieb:

    CMake finde ich nicht so überzeugend. Ich habe es eine Zeit lang benutzt und auf einmal war es nicht mehr möglich mit statischen Libs zu arbeiten.
    Da würde ich eher WAF empfehlen.

    hmm, also bei uns klappt es einwandfrei. Sind auch Nutzer der ersten Stunde und haben daher viele Macros selbst implementiert und nutzen diese auch weiterhin.
    Mit statischen Libs haben wir auch keine Probleme. Und ohne CMake wäre es das reinste Choas auf verschiedenen Platformen unseren Code zu kompilieren, zumal wir mit metis, boost, rcf, muParser, Qt, mpi, etc. pp. doch einige 3rdParty-Libs nutzen.

    Das von dir genannte Tool kenne ich nicht. Werde es mir aber auf jeden Fall einmal anschauen. Auto-Tools bzw. Bjam von Boost sind auch sehr gut, aber meines Erachtens nicht wirlich einsteigerfreundlich 😉



  • ich habe cmake nur beim compilen von kde4-programmen benutzt und noch nie selbst umgesetzt. aber warum benutzt man nicht einfach qmake->makefile ???



  • qmake ist prima, aber leider bei weitem nicht mächti genug um mit umfangreichen anderen libs umgehen zu können. allerdings ist mein stand bzgl qmake nun auch 3 jahre alt (Qt3.3). Allerdings sehe ich auch keinen Grund von CMake zu wechseln, denn alles was wir brauchen funktioniert einwandfrei. Es ist natürlich immer ein gewisser Einarbeitungsausfwand, bis man alles so verwenden kann, wie man möchte


Anmelden zum Antworten