2016-07-26 139 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

相关问题