这是我用来构建库的makefile。它运作良好。但它总是重新编译所有文件。我已宣布.PHONY。问题仍然存在。
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
答案 0 :(得分:1)
您的SRC_FILES
包含src/file1.o
和src/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 $@ $< $(MY_CFLAGS)
如果file1.c位于src / 中,$ {OBJECT_FILES}必须包含src / file1.o
通用规则需要与.c文件位于同一目录中的.o。