如何在Linux Makefile中正确编译/链接unittest?

时间:2014-11-27 17:41:51

标签: c++ linux makefile

在Linux系统上,我想使用gtest框架编译和链接unittest。我使用以下Makefile

CC := g++ # This is the main compiler
SRCDIR := src
BUILDDIR := build
TARGET := bin/myapp
TEST := tester

SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
CFLAGS := -g
LIB := -pthread -L lib  -L /usr/local/lib -lsqlite3 -lboost_thread -lcrypto
INC := -I include 

$(TARGET): $(OBJECTS)
    @echo " Linking..."
    @echo " $(CC) $^ -g -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(BUILDDIR)
    @echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<

clean:
    @echo " Cleaning..."; 
    @echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)

# Tests
$(TEST): $(OBJECTS)
    @echo " Compiling test..."
    $(CC) $(CFLAGS)  test/tester.cpp $(INC) -c -o build/$(TEST).o
    @echo " Linking test..."
    $(CC) $(CFLAGS) $(INC) -pthread test/tester.cpp /usr/lib/libgtest.a $(LIB) -L build build/tester.o -o bin/$(TEST) 

.PHONY: clean

主应用程序(myapp)的编译工作正常,但是我在编译/链接位于test目录中的测试文件时遇到了麻烦。

如果我不包含任何其他库(分别来自srcinclude),则以下行

$(CC) $(CFLAGS) -pthread test/tester.cpp /usr/lib/libgtest.a  $(INC) -o bin/$(TEST)

只是完美运行并创建一个可运行的可执行文件。但是,当我尝试在tester.cpp中包含我的项目中的某些库时,例如

#include "MyClass.h"

(在MyClass.h中定义为include,在MyClass.cpp定义为src)然后,通过上述Makefile,我得到了各种{{1 }}错误(在我标记为&#39;编译&#39;阶段为&#39; tester&#39;)。

我不确定是否应首先编译文件undefined reference然后链接所有库,或者我是否应该一步完成所有操作?我不知道该怎么做。

有关修复此Makefile的任何建议都表示赞赏......

1 个答案:

答案 0 :(得分:2)

OBJECTS := $(patsubst $(SRCDIR)/%.$(SRCEXT),$(BUILDDIR)/%.o,$(SOURCES))
OBJECTS := $(filter-out $(BUILDDIR)/main.o, $(OBJECTS))

$(TARGET): $(OBJECTS) $(BUILDDIR)/main.o
    @echo " Linking..."
    $(CC) $^ -o $@ $(LIB)

tester: bin/$(TEST)

bin/$(TEST): build/$(TEST).o $(OBJECTS)
    @echo " Linking test..."
    $(CC) $(INC) -pthread $^ /usr/lib/libgtest.a $(LIB) -L build -o $@

P.S。在得到答案后,请不要编辑这样的问题。如果您想进行更改(不会使现有答案变得毫无意义),请在问题的底部添加新测试,最好使用&#34; 编辑:&#34;