我的目录结构是:
Project/
+ Source/
| + Module_1/
| | + Module_1.c
| | + Module_1.h
| |
| + Module_2/
| | + Module_2.c
| | + Module_2.h
| |
| + MainFile.c
| + MainFile.h
|
+ Makefile
我的Makefile
包含:
SHELL := /bin/sh
CC := clang
AR := ar
CFLAGS := -fPIC -std=c99 -O2
LDFLAGS := -shared
ARFLAGS := -rcs
BLDDIR := Build
OBJDIR := Object
SOURCES := $(wildcard Source/**/*.c Source/*.c)
OBJECTS := $(patsubst %.c, $(OBJDIR)/%.o, $(SOURCES))
TARGET_A := $(BLDDIR)/MyLibrary.a
TARGET_SO := $(patsubst %.a, %.so, $(TARGET_A))
PREFIX ?= /usr/local
# ------------------------------------------------------------------------------
.PHONY: all build clean dev distclean _dir
all: build
dev: CFLAGS := -g -Wall -Wextra -fPIC -std=c99
dev: all
build: _dir $(TARGET_A) $(TARGET_SO)
_dir:
mkdir -p $(BLDDIR)
mkdir -p $(OBJDIR)
$(TARGET_A) : $(OBJECTS)
$(AR) $(ARFLAGS) %@ $(OBJECTS)
$(AR) -s %@
$(TARGET_SO):
$(CC) $(LDFLAGS) -o $@ $(OBJECTS)
$(OBJDIR)/%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) -r $(OBJDIR) test
distclean: clean
$(RM) -r $(BLDDIR)
我对此Makefile
有1个问题和1个问题:
$(OBJDIR)/%.o : %.c
行收到错误,我不知道如何修复它?我尝试将其更改为$(OBJECTS) : %.o : %.c
或%.o : %.c
,但仍然没有运气。Makefile
,我想知道我在此文件中的设置是否正常或我需要更好的策略/规则?如果是这样我怎么能改善这个?修改
我得到的错误是:
make: *** No rule to make target 'Object/MainFile.c', needed by 'Object/MainFile.o'. Stop.
修改
正如@Beta在评论中指出的那样,我更改了每个模块中的文件名,以便*.o
文件名不同。
答案 0 :(得分:1)
您的makefile正在尝试构建C源文件。您具有列为somefile.c
的每个对象的依赖关系。根据您的make文件,它是一个目录,位于Source
目录中。因此,将行$(OBJDIR)/%.o : %.c
更改为$(OBJDIR)/%.o : ../Source/%.c
。使用该规则,它应该找到.c
文件然后执行命令,因为.o
文件的依赖性存在。