2016-07-26 13 views
0

Ich habe eine einfache Struktur wie unten für eine kleine Bibliothek, die ich baue.make: Erstelle eine Test-Binärdatei für jede Datei im Testverzeichnis

  • Ich möchte make build die Bibliothek (libproj.a) aus Quellen unter bauen ./source
  • ich make build_test wollen mit test_ in seiner eigenen binären

Ich kann jede Quelldatei unter ./test Präfix bauen bauen die Bibliothek libproj.a ganz gut, aber kann nicht herausfinden, wie man die Tests baut. Ich erhalte derzeit den folgenden Linkfehler, wenn ich versuche, /cygdrive/d/Source/proj/build/obj/test_proj.o:test_proj.c:(.text+0x15): undefined reference to 'test' zu erstellen.

Verzeichnisstruktur

+---build 
| +---lib 
| +---obj 
| \---test 
+---include 
| \---proj 
+---source 
\---test 

Makefile

PROJECT    = proj 
LIBNAME    = lib$(PROJECT).a 

CFLAGS    = -Wall -Wextra -O0 

DIR_ROOT   = $(abspath .) 
DIR_SRC_LIB   = $(DIR_ROOT)/source 
DIR_SRC_TEST  = $(DIR_ROOT)/test 

DIR_BLD_OBJ   = $(DIR_ROOT)/build/obj 
DIR_BLD_LIB   = $(DIR_ROOT)/build/lib 
DIR_BLD_TEST  = $(DIR_ROOT)/build/test 

LST_OBJ_LIB   = $(patsubst $(DIR_SRC_LIB)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_LIB)/*.c)) 
LST_OBJ_TEST  = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_TEST)/*.c)) 
LST_BIN_TEST  = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_TEST)/%, $(wildcard $(DIR_SRC_TEST)/test_*.c)) 

INCLUDES   = -I $(DIR_ROOT)/include 

clean: 
    $(RM) $(LST_OBJ_LIB) 
    $(RM) $(LST_OBJ_TEST) 

build: 
    $(info build) 

build-test: $(LST_BIN_TEST) 
    $(info build-test) 

run-test: 
    $(info run-test) 

install: 
    $(info install) 

$(LIBNAME): $(LST_OBJ_LIB) 
    $(AR) rvs $(DIR_BLD_LIB)/[email protected] $^ 

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

$(DIR_BLD_TEST)/%: $(DIR_BLD_OBJ)/%.o $(LIBNAME) 
    $(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o [email protected] 

$(DIR_BLD_OBJ)/%.o: $(DIR_SRC_TEST)/%.c 
    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o [email protected] 
+0

In welche Art von Binärdateien möchten Sie diese Testdateien erstellen? In separate ausführbare Dateien? Oder Objektdateien, die mit etwas anderem verknüpft sind? –

+0

@GeorgP. separate ausführbare Dateien, ja. named test_libproj, test_mytest zum Beispiel (wenn das die Namen der entsprechenden Quelldateien sind). –

+0

@GeorgP. Weitere Informationen hinzugefügt –

Antwort

0

Meine Vermutung ist, dass diese Zeile:

$(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o [email protected] 

falsch ist. Sie übergeben die Bibliotheken vor den Objektdateien an den Compiler (ich nehme an, gcc). Wenn Ihr Compiler wie gcc funktioniert, wird der Code in den Bibliotheken verworfen, weil er noch nicht referenziert wurde, wenn er sie analysiert see -l option documentation.

Es sollte

$(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) $< -l $(PROJECT) -o [email protected] 

(Beachten Sie die veränderte Position der $<)

Des Weiteren werden, remeber, dass die Reihenfolge der Bibliotheken wichtig ist: siehe diese ausgezeichnete explanation.