Programm mit unterschiedlichem Funktionsumfang linken



  • Moin,

    ich habe ein kleines Programm mit vier verschiedenen Funktionen, die ich jetzt einfach mal in unterschiedlichen Dateien untergebracht habe.

    Beispiel:
    main.c
    f1.h; f1.c
    f2.h; f2.c

    In der main werte ich die Parameter beim Programmstart aus und starte davon abhängig eine Funktion.

    Ich habe jetzt überlegt ein Makefile so zu schreiben:

    CC = gcc
    CFLAGS = -o test
    
    voll: main.c f1.c f1.h f2.c f2.h
        $(CC) $(CFLAGS) main.c
    
    teila: main.c f1.c f1.h
        $(CC) $(CFLAGS) main.c
    
    teilb: main.c f2.c f2.h
        $(CC) $(CFLAGS) main.c
    

    In den Headern würde ich dann eine Zeile einfügen, wie:

    #define F1
    

    Und im case bei der Abfrage der Parameter

    #ifdef F1
    // arbeite
    #endif
    

    Das das so alles nicht klappt ist mir klar, mir fällt aber gerade nichts besseres ein. Kann mir jemand helfen?

    Bei Google fehlten mir wohl die richtigen Worte. Konnte da nichts richtiges rausfiltern.

    Danke



  • Du kannst dem Compiler auch in der Kommandozeile/Make mit -D ein define mitgeben.

    CC = gcc
    CFLAGS = -o test
    
    voll: main.c f1.c f1.h f2.c f2.h
        $(CC) $(CFLAGS) -DVOLL main.c  
    
    teila: main.c f1.c f1.h
        $(CC) $(CFLAGS) -DTEILA main.c
    
    teilb: main.c f2.c f2.h
        $(CC) $(CFLAGS) -DTEILB main.c
    

    und dann mit

    #if defined TEILA || VOLL
    #include "f1.h"
    ...
    

    PS: statt -DVOLL kannst du auch -DTEILA -DTEILB schreiben



  • Ah, danke. Das löst mein Problem. Danke 🙂



  • Auf jeden Fall muß aber das hier:

    voll: main.c f1.c f1.h f2.c f2.h
    $(CC) $(CFLAGS) main.c

    in:

    voll: main.c f1.c f1.h f2.c f2.h
    $(CC) $(CFLAGS) main.c f1.c f2.c

    geändert werden. Das gilt analog für die anderen Erstell-Varianten.



  • Noch flexibler wird die ganze Sache, wenn du den Code in externe Libraries auslagerst. Falls das ganze unter Windows und Linux laufen soll, würde ich mir aber mal die Mühe machen und dafür eine einheitliche Schnittstelle basteln, ist recht trivial. Dann kannst du einfach die Lib beilegen und je nachdem ob sie da ist, die Funktion ausführen lassen.



  • Ok, dank euch.


Anmelden zum Antworten