在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
目录中的测试文件时遇到了麻烦。
如果我不包含任何其他库(分别来自src
或include
),则以下行
$(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的任何建议都表示赞赏......
答案 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;