我正在尝试创建一个makefile,它可以为CppUTest创建一个exe。它找不到标题,我做错了什么?第一次制作一个makefile,而不是100%肯定我在做什么。
#The compiler to use
CC = g++
LINK = -g -pedantic -Wall -lstdc++ -lpthread -ldl -lm -Wl,-rpath,.
COMPILE = -g -O3 -D_THREAD_SAFE -pedantic -Wall -c -Wno-deprecated
#Name of the EXE file to create.
EXE = ./Tests
SRCS = $(shell ls *.cpp)
OBJS = $(subst .cpp,.o,$(SRCS))
#Extra flags to give to the C compiler.
CFLAGS =
#Libraries to include
LIBS= -lCppUTestExt -lCppUTest -lm
#Extra flags to give to the C++ compiler.
CXXFLAGS = -I/home/mg/DS-5-Workspace/Tests/include
#Extra flags to give to compilers when they are supposed to invoke the linker, ‘ld’,
#such as -L. Libraries (-lfoo) should be added to the LDLIBS variable
#instead.
LDFLAGS = -L/home/mg/DS-5-Workspace/Tests/cpputest/lib
#Extra flags to give to the C preprocessor and programs that use it (the C and
#Fortran compilers).
CPPFLAGS =
.SUFFIXES: .o .cpp
.cpp.o:
$(CC) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(COMPILE) $(LIBS) $<
all: $(OBJS)
$(CC) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(LIBS) $(OBJS) -o $(EXE) $(LINK)
-include depend.mak
depend:
g++ -MM $(SRCS) > depend.mak
#static:
#ar -crvs $(a) $(OBJS)
#shared: $(OBJS)
#$(CC) -shared -Wl,-soname -lc -o $(so) $(OBJS)
clean:
rm -rf $(OBJS) depend.mak $(EXE) $(so) $(a)
我有以下错误:
错误:CppUTest / CommandLineTestRunner.h:没有这样的文件或目录
答案 0 :(得分:1)
嗯,你混淆了很多东西。
让我们清理一下,只保留所需内容:
EXE := Tests
SRC := $(wildcard *.cpp)
OBJ := $(SRC:%.cpp=obj/%.o)
DEP := $(OBJ:.o=.d)
LDLIBS := -lCppUTestExt -lCppUTest -lm -lstdc++ -lpthread -ldl
LDFLAGS := -L/home/mg/DS-5-Workspace/Tests/cpputest/lib
LDFLAGS += -Wl,-rpath,.
CPPFLAGS := -I/home/mg/DS-5-Workspace/Tests/include
CPPFLAGS += -MMD -MP -D_THREAD_SAFE
CXXFLAGS := -W -Wall -Wno-deprecated -pedantic -O3 -g
.PHONY: all clean fclean re
all: obj $(EXE)
clean:
$(RM) -r obj
fclean: clean
$(RM) $(EXE)
re: fclean all
-include $(DEP)
$(EXE): $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
# %.a: $(OBJ)
# $(AR) crvs $@ $^
# ranlib $@
# %.so: CXXFLAGS += -fPIC
# %.so: $(OBJ)
# $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
obj:
@mkdir -p $@
obj/%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
一些解释:
避免$(shell ...)
函数,因为如果使用=
运算符而不是:=
运算符分配,则每次调用变量时都会执行该函数。
$(CC)
是一个内置变量,包含cc
或gcc
(应该是等效的)。使用内置$(CXX)
来使用g++
。
-g
,-pedantic
,-O3
,-Wno-deprecated
和-Wall
是编译器标志,它们应位于CFLAGS
(对于C)或CXXFLAGS
(对于C ++)内置变量。
-I <path>
和-D_THREAD_SAFE
是预处理程序标志,因此应位于CPPFLAGS
内置变量中。
-MMD -MP
会为每个.d
文件自动生成相关性文件(.o
扩展名)。你可以read more here。
.cpp.o:
是后缀规则,suffix rules are the old-fashioned way of defining implicit rules for make。你应该依靠这些已经了解的隐含规则或者以现代方式制作自己的规则。
您无需为自己广泛使用的目标定义.SUFFIXES:
。 在make读取任何makefile之前,变量SUFFIXES被定义为默认的后缀列表。 Make 3.82默认定义这些后缀:
.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
如果您有任何疑问,请继续。