我尝试创建 Makefile 以使我的工作更轻松,但似乎我做错了..下面是项目文件内容:
public void printDatabase() {
ArrayList array_list = handler.getAllCotacts();
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,
array_list);
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
}
这就是我的项目的样子,在我运行 Project/
Makefile
src/
main/
main.c
lib/
lib.c
lib.h
bin/
main/
main.o
lib/
lib.o
之后,它没有按预期工作,我无法弄清楚我的make
出了什么问题。
Makefile
任何人都可以看看并告诉我问题是什么,以及如何解决它
arubu@CQ56-LinuxMachine:here$ make
make: *** No rule to make target `bin/src/lib/lib.o', needed by `main'. Stop.
arubu@CQ56-LinuxMachine:here$ ls
bin Makefile Makefile~ src
arubu@CQ56-LinuxMachine:here$
答案 0 :(得分:1)
替换
$(OBJDIR)/%.o: %.c $(DEPS)
与
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(DEPS)
替换
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))
与
OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
替换
DEPS = lib.h
与
DEPS = $(SRCDIR)/lib/lib.h`.
至少它对我有用。
修改:修复buildrepo
目标
更改SRCDIRS
定义(删除起点" ./")并添加OBJDIRS
定义:
SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
现在在目标OBJDIRS
中使用buildrepo
。另请在buildrepo
列表中添加.PHONY
。
.PHONY: clean all run remake buildrepo
# ...
define make-repo
for dir in $(OBJDIRS); \
do \
mkdir -p $$dir; \
done
endef
所以你的完整Makefile现在应该是:
#
CC = gcc
RM = rm
EXEC = main
# #
SRCDIR = src
OBJDIR = bin
# #
SRCS := $(shell find $(SRCDIR) -name '*.c')
SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
OBJ = # main.o lib.o
DEPS = $(SRCDIR)/lib/lib.h
# #
CFLAGS = -I. -Wall -std=c99 -save-temps
LDFLAGS = #
.PHONY: clean all run remake buildrepo
all: $(EXEC)
@echo "Finish."
#
$(EXEC): buildrepo $(OBJS)
$(CC) -o $@ $(OBJS) $(DEPS) $(CFLAGS)
#
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
#
run:
./$(EXEC)
#
remake: clean all
#
buildrepo:
@$(call make-repo)
#
define make-repo
for dir in $(OBJDIRS); \
do \
mkdir -p $$dir; \
done
endef
#
clean:
@echo "Cleaning up.."
$(RM) -f $(OBJS) $(EXEC)