2015-01-19 20 views
0

Я пытаюсь увидеть автогенерируемую зависимость от Makefile ниже:Makefile

OBJS := main.o 

    run : $(OBJS) 
     $(CC) $(OBJS) -o run -lstdc++ 

    -include $(OBJS:.o=.d) 

%.o : %.cpp 
     $(CC) -c $(CFLAGS) $*.cpp -o $*.o 

%.d : %.cpp 
     @set -e; rm -f [email protected]; \ 
     $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 
     echo "creating dependency file."; \ 
     sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
     rm -f [email protected]$$$$ 

    # remove compilation products 
    clean : 
     rm -f run *.o *.d* 

Но Makefile генерировать огромный список зависимостей в main.d, но фактической необходимо первые несколько строк , Итак, где я ошибаюсь?

+0

Что содержимое в 'main.d', что вы не думаете, принадлежат там? –

+0

'main.o main.d: main.cpp main.h \ ** /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/ C++/4.4.7/iostream \ /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/x86_64-redhat- linux/bits/C++ config.h \ /usr/include/bits/wordsize.h \ /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../ ../include/c++/4.4.7/x86_64-redhat-linux/bits/os_defines.h \ /usr/include/features.h /usr/include/sys/cdefs.h \ ** ' В идеале это должно шоу только первая линия (** main.o main.d: main.cpp main.h **). Почему остальные строки идут, и ожидаемый результат был ** main.o: main.cpp main.h **? –

+0

В вашем коде также содержатся некоторые из них (и они включают в себя другие заголовки). Предварительные требования не могут останавливаться на заголовочных файлах первого уровня или они будут пропускать вещи. Это '' '' буквальный? –

ответ

1

Попробуйте вместо этого:

OBJS := main.o 

    run : $(OBJS) 
     $(CC) $(OBJS) -o run -lstdc++ 

    -include $(OBJS:.o=.d) 

%.o : %.cpp 
     $(CC) -c -MMD -MP $(CFLAGS) $*.cpp -o $*.o 

    # remove compilation products 
    clean : 
     rm -f run *.o *.d*