gpt4 book ai didi

c - 无法包含 C 编译文件夹

转载 作者:行者123 更新时间:2023-11-30 14:38:32 25 4
gpt4 key购买 nike

如果 C 位于外部文件夹中,则一切都会编译,但是当 lib.c 位于 [lib] 文件夹中时,会出现错误: make: *** Norule to make target 'obj/lib.o' ,“运行”所需。停止。

应该如何修正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

提前感谢您的建议。

最佳答案

你的Makefile中有一些怪癖,但我是这样让它工作的:

  1. 删除行 LDIR =./lib 中的尾随空白
  2. 在方便的地方插入VPATH=$(LDIR)

现在 make -n run 显示(但不运行)所有预期的命令行:

gcc -c -o obj/lib.o ./lib/lib.c -I ./inc ./lib
gcc -c -o obj/main.o main.c -I ./inc ./lib
gcc -c -o obj/test_usages.o test_usages.c -I ./inc ./lib
gcc -o run obj/lib.o obj/main.o obj/test_usages.o -I ./inc ./lib
echo "=========================================================="
./run
echo "=========================================================="

顺便说一句,您可以使用这些选项来调试 Makefile:

make -npr run 打印所有变量、规则等,但不打印内置变量。

make -nd run 打印所有决策,很多。

关于c - 无法包含 C 编译文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56521446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com