2016-07-25 11 views
1

Ich möchte Makefile für meine statische Bibliothek haben, wo ich es als Programm erstellen kann, um einfachen Selbsttest durchzuführen. Mein aktueller Makefille sieht aus wie folgt:Makefile für statische Bibliothek mit Selbsttest-Fähigkeit

OBJECTS = sm3.o ./core/sm3_internal.o 
INCLUDES = -I. -I./core 
CFLAGS = -g -Wall -O3 
CC = c99 

OUT = libsm3.a 

%.o: %.c 
    $(CC) -c -o [email protected] $< $(CFLAGS) $(INCLUDES) 

$(OUT): $(OBJECTS) 
    ar rcs $(OUT) $(OBJECTS) 

Bei meiner Hauptbibliotheksdatei Ich habe:

#ifdef TEST 
main(int argc, int* argv[]) 
{ 
    //my self-test logic here 
} 
#endif 

Wo soll ich -DTEST Flagge hinzufügen? Wenn ich es CFLAGS hinzufügen und dann Zeile hinzu:

test: $(OBJECTS) 

Bibliothek würde auch mit Haupt bauen sein, was offensichtlich nicht etwas ist, was ich will.

+2

Warum setzen Sie das Testprogramm nicht in einer separaten Quelldatei? – immibis

+0

@immibis kein besonderer Grund, es schien eine gute Idee zu sein, Bibliothek auf diese Weise zu validieren – adamws

Antwort

1

Ich würde vorschlagen, dass Sie main.c bedingt statt kompilieren:

$(TESTOUT): $(OBJECTS) $(TESTOBJ) 
    $(CC) -o [email protected] $< 
+0

erster Vorschlag produziert Bibliothek, änderte es ein wenig (ersetzt OUT mit OBJECTS und Test mit sm3 - muss die Benennung übereinstimmen?) Und ich habe funktioniert mit meinem Test, aber es gibt folgende Probleme: 1) wenn ich zuerst Test dann wenn Bibliothek benutze, bekomme ich doppelte Hauptfunktion, und wenn ich Bibliothek zuerst baue, scheitert mein Testaufbau mit Fehler 'undefinierter Verweisung auf WinMain' (I benutze cygwin) – adamws

+0

Ye, die alte Objektdatei hat sich nicht geändert, also spielt es keine Rolle, was Sie definieren. Du könntest es umgehen, indem du die Objektdatei löschst, aber ich denke, du solltest es stattdessen mit zwei separaten Zielen machen. Ich werde den ersten Vorschlag entfernen. – a3f

Verwandte Themen