Probleme mit 'make'



  • @rüdiger:

    das lustige is ja irgendwie, dass die Programme alle einwandfrei funktionieren.

    Aber nur beim erstellen bzw. aufrufen von Makefiles kommen Fehler.
    Das ist der Grund, warum ich sage, ich komme nicht mit den Makefiles zurecht,
    weil das Programm prima funktioniert.

    Aber zum Problem:

    Also erstens mal habe ich gesehen, dass meine if-Abfrage völliger Schmarrn ist.
    Stattdessen habe ich aus dem ">=" bei for ein ">" gemacht 😉

    Aber trotzdem...ich verstehe nicht, was du meinst.
    Wieso kein Effekt? Die Zeile macht doch etwas oder nicht? Sie dekrementiert
    'c' und sie überprüft etwas..

    Tut mir leid, ich verstehe ja dass man selber was tun muss und nicht das forum für jeden Dreck missbrauchen soll, aber ich verstehe es wirklich nicht 😞

    Wieso regt sich make über die Zeile auf, der Compiler aber nicht und das Programm funktioniert?

    danke 😞



  • hdi schrieb:

    Aber nur beim erstellen bzw. aufrufen von Makefiles kommen Fehler.
    Das ist der Grund, warum ich sage, ich komme nicht mit den Makefiles zurecht,
    weil das Programm prima funktioniert.

    Das möchte ich sehen, dass die Meldung nicht kommt, wenn Du den Compiler manuell anwirfst 😉

    hdi schrieb:

    Aber trotzdem...ich verstehe nicht, was du meinst.
    Wieso kein Effekt? Die Zeile macht doch etwas oder nicht? Sie dekrementiert
    'c' und sie überprüft etwas..

    Die Initialisierung im Kopf der for-Schleife: Dort steht bei Dir "c;" - dieses Statement macht garnix, hat also keinen Effekt. Daher die Meldung. Effekt hätte z.B. "c=1;" oder "c++;" aber nicht "c;". Davon abgesehen ist die Meldung nur eine Warnung, was auch der Grund dafür ist dass das Programm trotzdem funktioniert. Der Compiler möchte Dir halt nur sagen "schau mal, da ist was von dem ich glaube dass Du was anderes gemeint haben könntest".

    hdi schrieb:

    Wieso regt sich make über die Zeile auf, der Compiler aber nicht und das Programm funktioniert?

    Der Compiler regt sich aus o.g. Gründen auf. Make nicht. Wie kommst Du überhaupt darauf die Fehlermeldungen könnten von make stammen?



  • Also genau das mit der Initialisierung in der for-Anweisung hatte ich mir gedacht.

    In meinem Programm steht ja:

    int c = argc-1;
    for(c;c >0;c++)
    

    wenn ich allerdings die erste Zeile weglasse und statt dessen schreibe:

    for(int c = argc-1;c>0;c++)
    

    dann kommt eine fehlermeldung beim compilen:

    P-1-2.c: In function ‘main’:
    P-1-2.c:8: error: ‘for’ loop initial declaration used outside C99 mode
    

    Und noch einmal, ich schwöre es ist wirklich so:
    Wenn ich das Programm compile mit gcc dann kommt NICHTS.
    keine warnmeldung.

    jedoch wenn ich make aufrufe, kommt die meldung.

    d.h. es ist anders herum, wie du sagst. der compiler meckert bei gcc nicht, aber bei make. deswegen dachte ich, dass make damit ein problem hat.

    nun, wie dem auch sei: was soll das mit dem "outside C99 mode"?

    mfg



  • hdi schrieb:

    In meinem Programm steht ja:

    int c = argc-1;
    for(c;c >0;c++)
    

    wenn ich allerdings die erste Zeile weglasse und statt dessen schreibe:

    for(int c = argc-1;c>0;c++)
    

    dann kommt eine fehlermeldung beim compilen:

    P-1-2.c: In function ‘main’:
    P-1-2.c:8: error: ‘for’ loop initial declaration used outside C99 mode
    

    Dann übersetzt Du den Code im C89-Modus (bei gcc glaube ich auch der Standardmodus). Da kannst Du Variablen im Kopf der Schleife nicht definieren. Aber der andere Code war soweit vollkommen in Ordnung. Du hättest lediglich das "Statement without effect" wegnehmen müssen:

    int c = argc-1;
    for( ; c >0; c++)
    

    Und noch einmal, ich schwöre es ist wirklich so:
    Wenn ich das Programm compile mit gcc dann kommt NICHTS.
    keine warnmeldung.

    Hast Du im Makefile evtl. -Wall gesetzt, und manuell nicht?

    nun, wie dem auch sei: was soll das mit dem "outside C99 mode"?

    Wie gesagt, diese Form der Definition im Kopf der Schleife ist erst in C99 (oder C++) möglich, nicht in ANSI C 89. Du kannst aber (entsprechend neue Version vorausgesetzt) auch dem gcc mit dem Parameter --std=c99 C99 beibringen.



  • hdi schrieb:

    wenn ich allerdings die erste Zeile weglasse und statt dessen schreibe:

    for(int c = argc-1;c>0;c++)
    

    Probier mal

    int c;
    for(c = argc-1;c>0;c++)
    

    Kleiner Tip: wenn du mal nicht weiterkommst mit Fehlermeldungen: copy&paste bei google, und meistens bist du sehr schnell etwas schlauer geworden 😉



  • Hast Du im Makefile evtl. -Wall gesetzt, und manuell nicht?

    Jetzt endlich verstehe ich auch, wieso das alles mit make nix zu tun hat!
    Ich wusste nicht, dass gcc standartmässig nicht -Wall aufruft.
    Und weil mir make Meldungen ausgegeben hat, gcc aber nicht, dachte ich eben,
    es liegt am Makefile.

    p.s.: Kann man -Wall irgendwie zum Standard bei gcc machen?
    Ich würde diese Option sehr gerne nutzen, aber ohne jedesmal den Parameter anzugeben.

    p.p.s: Wieso wird denn Standar-t vom Forum zensiert? was ist denn so schlimm am
    Begriff "dar-t" 😕

    mfg, ihr seid echt spitze!



  • hdi schrieb:

    p.p.s: Wieso wird denn Standar-t vom Forum zensiert? was ist denn so schlimm am
    Begriff "dar-t" 😕

    An dem Spiel, wo man mit Pfeilen auf eine Zielscheibe wirft, ist nichts verkehrt - aber der Begriff Stand-art könnte doch eher die Kunst bezeichnen, Messestände kunstvoll zu gestalten. Es ist halt einfach falsch, so wie vor-raus 😉



  • http://www.k-faktor.com/stand art/

    😉

    Blede Zensur, einfach Blank wegnehmen



  • Das meinte ich ja auch!
    Ich dachte mir halt: wenn schon etwas compilen, warum dann nich auch gleich noch n schöner Messestand. 😃



  • hdi schrieb:

    In meinem Programm steht ja:

    int c = argc-1;
    for(c;c >0;c++)
    

    Du zählst tatsächlich von argc-1 nach oben, bis du zu einem Integer-Überlauf kommst? Na ob das im Sinne des Erfinders liegt?



  • nein, ich dekrementier.
    habs nur falsch eingetippt.



  • nochmal um auf meine frage zurückzukommen, die noch nicht beantwortet wurde
    (hat damit eig. nix mehr zu tun will aber keinen neuen thread aufmachen deshalb):

    kann ich irgendwie den parameter -Wall für gcc als Standard einstellen, sodass ich ihn nicht immer zusätzlich eintippen muss?

    danke



  • Zumindest ich kenne keine globale
    Konfigurationsmöglichkeit für den gcc.

    echo "alias gcc='gcc -Wall'" >> ~/.bashrc
    Sollte jedoch funktionieren.



  • make install install maker


Anmelden zum Antworten