【发布时间】:2019-06-10 06:26:58
【问题描述】:
如果 C 在外部文件夹中,一切都会编译,但是当 lib.c 在 [lib] 文件夹中时,它会给出错误:make: *** No rule to make target 'obj/lib.o', needed by 'run'. Stop.
应该如何更正makefile以确保编译成功?
修改makefile的正确方法是什么?
树是这样的:
├── inc
│ └── main.h
├── lib
│ └── lib.c
├── main.c
├── main_functions.sh
├── Makefile
└── test_usages.c
生成文件:
# IDIR =../include \
This is a makefile \
IDIR =./inc
CC=gcc
ODIR=obj
# LIB_SRC_DIR =./lib
LDIR =./lib
CFLAGS=-I $(IDIR) $(LDIR) ## added $(LDIR)
# header files required
_DEPS = *.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_DEP_LIB = *.c ##
DEPS_LIB = $(patsubst %,$(LDIR)/%,$(_DEP_LIB)) ##
_OBJ = lib.o main.o test_usages.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS) $(DEPS_LIB) ## added $(DEPS_LIB)
$(CC) -c -o $@ $< $(CFLAGS)
#%.o: %.c
# $(CC) $(CFLAGS) $(INCLUDES) -c $(input) -o $(output)
# make commands options: make <options>, e.g. make hello_make
# executable name
hello_make: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
run: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
echo "=========================================================="
./run
echo "=========================================================="
.PHONY: clean
clean:
echo "cleaning ...." $(ODIR)/*.o
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ ./*.exe
提前感谢您的建议。
【问题讨论】:
-
使用
CFLAGS=-I $(IDIR) $(LDIR)使CFLAGS等于-I ./inc ./lib。第二个选项 (./lib) 无效。你想添加-I ./lib吗? -
@Someprogrammerdude 您这样做是作为评论,因为它没有解决主要问题,对吗?或者它可以解决所有问题?
-
你尝试过橡皮鸭吗? IE。向自己解释 make 文件中每一行的每一个细节。它是ericlippert.com/2014/03/05/how-to-debug-small-programs 的一部分(我认为它也可以应用于
make以及任何其他语言)。 -
嗯,这似乎是您显示的错误消息的根本原因(我不得不承认我以前没有真正阅读过 :))
-
您将如何修改 make 文件以在 ./lib/ 中包含 c 代码,就像树中描述的那样?
标签: c makefile compilation