2016-07-26 136 views
0

對於我正在構建的小型庫,我有一個簡單的結構,如下所示。make:爲測試目錄中的每個文件創建一個測試二進制文件

  • 我想make build打造下./source
  • 我想make build_test從源代碼庫(libproj.a)建立與test_前綴./test下,每個源文件到它自己的二進制

我可以建立庫libproj.a蠻好的,但無法弄清楚如何構建測試。我在嘗試構建/cygdrive/d/Source/proj/build/obj/test_proj.o:test_proj.c:(.text+0x15): undefined reference to 'test'時,目前收到以下鏈接器錯誤。

目錄結構

+---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

想要構建這些測試文件的是哪種二進制文件?分成可執行文件?還是鏈接到別的東西的對象文件? –

+0

@GeorgP。單獨的可執行文件,是的。例如命名爲test_libproj,test_mytest(如果這是相應的源文件名稱)。 –

+0

@GeorgP。增加了更多信息 –

回答

0

我的猜測是,這條線:

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

是錯誤的。你傳遞給編譯器(我假設gcc)在對象文件之前的庫。如果你的編譯器像gcc那樣工作,那麼庫中的代碼就會被丟棄,因爲它在解析它們的時候還沒有被引用。see -l option documentation

應該

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

(注:$<改變後的位置)

此外,remeber該庫的順序是非常重要的:看到這個優秀的explanation

相關問題