2014-04-30 74 views
1

這是我用來構建庫的makefile。它運作良好。但它總是重新編譯所有文件。我已經聲明.PHONY。問題仍然存在。Makefile - 每次編譯所有文件

PROGRAM=mylib 


[...] 
OBJS= dir/file1.o \ 
      dir/file2.o 

SRC= $(addprefix dir/,$(OBJS)) 

.PHONY: all clean install 
all: ${SRC} 
    ${CC} --shared -o lib${PROGRAM}.so ${OBJS} 

%.o: %.c 
    ${CC} -c ${MY_CFLAGS} $*.c ${INCLUDES} 

另外,如果我的Makefile有任何主要問題,請評論。

文件樹如下:

my_lib 
├── include 
│   ├── file1.h 
└── src 
    ├── file1.c 
    ├── file2.c 

回答

1

SRC_FILES包含src/file1.osrc/file2.o等。這很可能不是你想要的。通過這樣做和通用的.c到.o規則中的$*.c你打破了make's文件規則依賴自動性。

我已經重寫你的Makefile這樣的:

[..] 

all: lib${PROGRAM}.so  # create dependency from all to your .so 

lib${PROGRAM}.so: ${OBJECT_FILES}  # create a dep for your .so to all object files 
    ${CC} ${SHARED_FLAGS} -o lib${PROGRAM}.so ${OBJECT_FILES} 

%.o: %.c # generic rule to build .o from .c 
    $(CC) -c -o [email protected] $< $(MY_CFLAGS) 

$ {} OBJECT_FILES必須包含的src/file1.o如果file1.c中被放在src/

通用規則需要.o與.c文件位於同一目錄中。

+0

嗨帕特里克。我用文件的樹結構更新了我的帖子。我已經命名爲SRC_FILES,但我的意思是OBJ_FILES本身。對於我的樹結構來說,編譯你的更改失敗了:「make:***沒有規則可以讓'lib1x.so'所需的目標'file1.c'停止。」我仍在看我的變化是否糟糕。謝謝 –

+0

$ {OBJECT_FILES}必須包含src/file1.o是file1.c位於src/ –

+0

完美!!謝謝。 :) –