Lassen Sie mich meine Situation erklären: Ich habe ein Programm, das verschiedene Arten von Modellen enthält (sagen wir 10, aber die tatsächliche Anzahl ist ziemlich hoch). Alle diese Modelle haben einen Namen und die entsprechende Datei "model1.cu" und "model1.h". Alle diese Dateien haben eine Funktion, die eine Gleitkommazahl erzeugt und sie in allen Dateien mit den gleichen Argumenten zurückgibt (sagen wir float returnfunction(float voltage)
). Diese spezielle Funktion wird in der Hauptdatei benötigt. In der Make-Datei ich eine Option gesetzt haben, so dass Sie nur den Code für das Modell kompilieren Sie werden die Berechnung wie folgt:Makro in Makefile? Bedingte h-Datei-Aufnahme?
ifdef MODEL1
SRCS := model1.cu
OBJS := model1.o
endif
ifdef MODEL2
SRCS := model2.cu
OBJS := model2.o
endif
SRCS += main.c
Jetzt kann ich das richtige Modell auswählen, indem Sie „MODEL1 = 1 machen“. Das Problem tritt in der Hauptdatei auf. Die Funktion returnfunction(float voltage)
ist in model1.h definiert, also sollte ich sie einschließen. Aber wenn ich schließe
#ifdef MODEL1
#include "model1.h"
#endif
#ifdef MODEL2
#include "model2.h"
#endif
in meiner main.c Datei, erhalte ich die Fehlermeldung, dass die Funktion returnfunction
ist nicht überall definiert. Gibt es eine Möglichkeit, die richtige h-Datei in meine Hauptdatei aufzunehmen? Vorzugsweise mit dem, dass ich bereits kompilieren mit MODEL1 = 1.
Jede Hilfe wird sehr geschätzt!
Übrigens ist ein sauberer Weg dies zu tun, jedes Modell in ein separates Unterverzeichnis zu legen, mit Dateien, die z. 'model.cu' und' model.h'. Setzen Sie 'VPATH' und fügen Sie ein' -I' Flag aus Ihrem Makefile, dann können Sie 'SRCS: = model.cu',' OBJS: = model.o' und generisch '#include' in Ihrem 'main.c '. –
Ich mag Ihre Idee, aber könnten Sie auf die Verwendung von VPATH und -I angeben? Ich bin nicht mit allen möglichen Optionen in einem Makefile vertraut und die Dokumentation ist oft sehr schwer für mich zu verstehen. Was ich gerne wissen würde, sind die Zeilen, die Sie in das Makefile schreiben würden (angenommen, die Map heißt: NewModel und enthält model.cu und model.h) (der Rest des Konzepts, das ich bekomme). Ist es etwas wie: #ifdef MODEL1 VPATH = -I./NewModel #endif? – Tim
Zu lang für einen Kommentar, also habe ich eine Antwort dafür geschrieben, es fallen im Grunde alle 'ifdef', die Sie dort haben. Es ist nur ein Vorschlag, die angenommene Antwort wird Ihren geposteten Code reparieren. –