【问题标题】:Not able to include folder for C compilation无法包含 C 编译的文件夹
【发布时间】: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


【解决方案1】:

您的 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 打印所有决定,很多。

【讨论】:

  • VPATH 是完美的答案。谢谢你,@忙蜂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2018-11-12
  • 2016-12-02
  • 2013-09-21
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多