不按预期工作

时间:2016-04-16 18:40:08

标签: c makefile

我尝试创建 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$ 

1 个答案:

答案 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)