makefile没有编译更改的主程序文件

时间:2017-09-13 01:36:38

标签: makefile

letter_grade(nums.sum.fdviv(nums.size))
如果obj目录为空或OBJS中包含其中一个文件,则

make testsuite有效。执行此操作一次后,再编辑该文件 testsuite.c,make testsuite说没有变化。如何使文件检测到testsuite.c已更改或其中一个.h文件已更改?

2 个答案:

答案 0 :(得分:1)

如果我理解正确的话,这是我为你的具体案例documentation about request headers做的一个例子。

据我所知,你有一个main.c文件,它是你主程序的主要文件。您还有一些test.c文件,其中包含其他主电源。你有其他源文件,我称之为SHARED_SRC,其中不包含带有main-s的.c文件。这些SHARED_SRC文件用于编译主程序和测试。

要运行此makefile,请运行makemake 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.otestsuite.c。可能的解决方法:

testsuite: obj/testsuite.o $(OBJS)
    $(CC) -o $@ $^ $(LDFLAGS) $(LIBS)

请注意,chmod是不必要的,生成的可执行文件是可执行的。

您可能还想generate header dependencies automatically