2013-03-03 12 views
15

Oto kod Makefile:Makefile usuwa pliki obiektów bez powodu

CC=gcc 
CXX=g++ 
OBJS=OMXComponent.o Event.o hello_jpeg.o JPEG.o OMXCore.o Locker.o Logger.o 
BIN=hello_jpeg.bin 

# include ../Makefile.include 


CFLAGS+=-DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi 

LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lGLESv2 -lEGL -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt -L../libs/ilclient -L../libs/vgfont 

INCLUDES+=-I$(SDKSTAGE)/opt/vc/include/ -I$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -I$(SDKSTAGE)/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont 

all: $(BIN) $(LIB) 

%.o: %.c 
    @rm -f [email protected] 
    $(CC) $(CFLAGS) $(INCLUDES) -g -c $< -o [email protected] -Wno-deprecated-declarations 

%.o: %.cpp 
    @rm -f [email protected] 
    $(CXX) $(CFLAGS) $(INCLUDES) -g -c $< -o [email protected] -Wno-deprecated-declarations 

%.bin: $(OBJS) 
    $(CC) -o [email protected] -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic 

nie jestem pewien dlaczego, ale nagle, gdy wzywam mojego Makefile, zaczęło usuwając wszystkie pliki obiektów !!! To nie było usuwanie wcześniej, ale ostatnio po uruchomieniu Makefile, to co mam w oknie konsoli:

rm OMXCore.o JPEG.o OMXComponent.o Logger.o hello_jpeg.o Locker.o Event.o 

Każdy pomysł, dlaczego jest usunięcie mojego obiektu pliki? i jak zatrzymać się w Make, aby go usunąć? Co jest jeszcze bardziej dziwne, to to, że nie zostało usunięte wczoraj, i wszystko zaczęło się dzisiaj, beze mnie robi żadnych ulepszeń lub dokonywania jakichkolwiek zmian !!! Teraz, gdy dokonuję niewielkiej zmiany w jednym z moich plików src, teraz muszę długo czekać, aż wszystkie inne pliki obiektów zostaną ponownie odbudowane, co nie jest konieczne i spowalnia mnie.

jestem upewniając się, że jestem w odpowiednim katalogu, I nawet dał "make" pełną ścieżkę, w przypadku gdy jest podniesienie inny Makefile

make -f/my_full_path/Makefile

Podczas Makefile biegałem, robiłem „lS” w innym terminalu, a ja zauważyłem, że mam poprawnie gromadzenie plików obiektowych, jak poniżej:

-rw-rw-r-- 1 pi pi 1170 Mar 3 19:28 Makefile 
-rw-r--r-- 1 pi pi 482052 Mar 3 19:30 OMXComponent.o 
-rw-r--r-- 1 pi pi 19984 Mar 3 19:30 Event.o 
-rw-r--r-- 1 pi pi 14688 Mar 3 19:30 hello_jpeg.o 
-rw-r--r-- 1 pi pi 162260 Mar 3 19:31 JPEG.o 
-rw-r--r-- 1 pi pi 215492 Mar 3 19:31 OMXCore.o 
-rw-r--r-- 1 pi pi 76384 Mar 3 19:31 Locker.o 
-rw-r--r-- 1 pi pi  0 Mar 3 19:31 Logger.o 

Ale nagle, gdy wszystko jest zbudowany, wszystkie pliki obiektów ge t usunięto !!!

I tu jest wyjście komendy Makefile:

[email protected] /opt/vc/src/hello_pi/hello_jpeg_v2 $ make -f /opt/vc/src/hello_pi/hello_jpeg_v2/Makefile 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c OMXComponent.cpp -o OMXComponent.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c Event.cpp -o Event.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c hello_jpeg.cpp -o hello_jpeg.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c JPEG.cpp -o JPEG.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c OMXCore.cpp -o OMXCore.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c Locker.cpp -o Locker.o -Wno-deprecated-declarations 
g++ -g -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I../libs/ilclient -I../libs/vgfont -g -c Logger.cpp -o Logger.o -Wno-deprecated-declarations 
g++ -g -o hello_jpeg.bin -Wl,--whole-archive OMXComponent.o Event.o hello_jpeg.o JPEG.o OMXCore.o Locker.o Logger.o -L/opt/vc/lib/ -lGLESv2 -lEGL -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt -L../libs/ilclient -L../libs/vgfont -Wl,--no-whole-archive -rdynamic 
rm OMXCore.o JPEG.o OMXComponent.o Logger.o hello_jpeg.o Locker.o Event.o 
+1

, ale nie robię "rm"!?! jak sprawić, aby nie usuwał plików? – user2112840

+0

Czy usuwa pliki '.o' przy każdym uruchomieniu make, nawet jeśli nie masz jednej zmiany pliku' .c' lub '.cpp'? – Tuxdude

+0

Czy jesteś pewien, że jest to ** dokładnie ** plik Makefile, który używasz? Czy możesz dodać ** kompletne ** wyniki konsolowe, które otrzymasz po uruchomieniu Make, zaczynając od czystej? –

Odpowiedz

30

Pliki są usuwane, ponieważ uważa je make „pośredni”. Gdy make tworzy łańcuch reguł, aby utworzyć wymaganie wstępne, traktuje wszystkie pliki utworzone przez łańcuchy pośrednie jako "pośrednie" i usuwa wtedy, gdy cel jest tworzony. Zobacz Chained Rules w instrukcji dla GNU make.

W twoim przypadku, można temu zapobiec na dwa sposoby: pozbyć się reguły %.bin, co wydaje się nie tak i tak, bo mówi, że wszystkie.bin plików zależy na stałej liście plików obiektowych, i zastąpienie go przez

$(BIN): $(OBJS) 
     # as before 

lub zaznacz pliki przedmiot jako "wtórne":

.SECONDARY: $(OBJS) 
+0

Tak, masz absolutną rację. Chociaż najwyraźniej nie jest to jedyny problem (zobacz mój komentarz do OP dotyczący 'g ++' vs. 'gcc'). –

13

Wystarczy dodać:

.PRECIOUS: %.o 

To sprawi, że pliki pośrednie są również cenne

Powiązane problemy