letter_grade(nums.sum.fdviv(nums.size))
如果obj目录为空或OBJS中包含其中一个文件,则make testsuite有效。执行此操作一次后,再编辑该文件 testsuite.c,make testsuite说没有变化。如何使文件检测到testsuite.c已更改或其中一个.h文件已更改?
答案 0 :(得分:1)
如果我理解正确的话,这是我为你的具体案例documentation about request headers做的一个例子。
据我所知,你有一个main.c文件,它是你主程序的主要文件。您还有一些test.c文件,其中包含其他主电源。你有其他源文件,我称之为SHARED_SRC,其中不包含带有main-s的.c文件。这些SHARED_SRC文件用于编译主程序和测试。
要运行此makefile,请运行make
和make tests
。
要在修改头文件时重新编译,我只需添加:
obj/%.o: %.c $(HEADERS)
- 每个.o对象的规则
我为测试创建了单独的规则。注意:测试文件名必须以“test”前缀开头。
我希望它能回答你的问题。
编辑:在这里添加了整个示例。
生成文件:
#We suppose that the program with the main main function is in main.c
NAME = JWooten
ALLSRCS := $(wildcard *.c)
OTHERSRCS := testMain1.c testMain2.c
SHARED_SRC := $(filter-out main.c $(OTHERSRCS),$(ALLSRCS))
ALL_OBJS := $(addprefix obj/,$(ALLSRCS:.c=.o))
SHARED_OBJS := $(addprefix obj/,$(SHARED_SRC:.c=.o))
OTHER_OBJS := $(addprefix obj/,$(OTHERSRCS:.c=.o))
MAIN_OBJ := obj/main.o
TEST_NAMES := $(OTHERSRCS:.c=)
HEADERS := $(wildcard *.h)
all: $(NAME)
#Adding the $(HEADERS) to the rule, makes it recompile the object whenever the
#header is modified
obj/%.o: %.c $(HEADERS)
gcc -c $< -o $@
#Rules for the tests.
test%: test%.c $(HEADERS)
gcc $(SHARED_OBJS) obj/$@.o -o $@
-chmod a+x $@
make_obj_dir:
@mkdir -p obj
#Rule to make the tests
tests: make_obj_dir $(SHARED_OBJS) $(OTHER_OBJS) $(TEST_NAMES)
$(NAME): make_obj_dir $(SHARED_OBJS) $(MAIN_OBJ)
gcc $(SHARED_OBJS) $(MAIN_OBJ) -o $(NAME)
-chmod a+x $(NAME)
clean:
rm -f *.o
rm -rf obj
fclean: clean
rm -f $(TEST_NAMES)
rm -f $(NAME)
re: fclean all
main.c中:
#include "header.h"
int main(void)
{
some_function1();
some_function2();
return (0);
}
file1.c中
#include "header.h"
void some_function1(void)
{
printf("Function 1\n");
}
file2.c中
#include "header.h"
void some_function2(void)
{
printf("Function 2\n");
}
testMain1.c:
#include "header.h"
int main(void)
{
some_function1();
return (0);
}
testMain2.c:
#include "header.h"
int main(void)
{
some_function2();
return (0);
}
header.h:
#ifndef HEADER_H
# define HEADER_H
# include <stdio.h>
void some_function1(void);
void some_function2(void);
#endif
答案 1 :(得分:1)
testsuite
必须取决于testsuite.o
或testsuite.c
。可能的解决方法:
testsuite: obj/testsuite.o $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
请注意,chmod
是不必要的,生成的可执行文件是可执行的。