c - Makefile C 子目录规则来制作 obj

标签 c compilation compiler-errors makefile

我正在运行一个简单的 Makefile,没有任何问题:

CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

文件位于主项目的目录中:

./project/Makefile
./project/hellomake.c
./project/hellomake.h

然后我尝试整理文件,并放置如下内容:

./project/Makefile
./project/src/hellomake.c
./project/include/hellomake.h

和额外的子目录目录:

./project/lib
./project/obj

然后是新版本的Makefile:

IDIR =include
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I$(IDIR)

ODIR=obj
LDIR =lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

我在 Linux 上使用带有 gcc 编译器的 Emacs 进行编译:

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

然后,我在 Emacs 上运行:

<Esc> 
x
compile
make

它给出了信息:

"./project/src/" -*-
make: *** No rule to make target `obj/hellomake.o', needed by `hellomake'.  Stop.
Compilation exited abnormally with code 2 at Wed Oct  3 17:10:01

要包含在 Makefile 文件中应该缺少什么规则?

非常感谢所有意见和建议。


感谢您的建议,已添加到代码中。然后编译器提示:

make -k 
make: *** No rule to make target `src/hellomake.c', needed by `obj/hellomake.o'.
make: *** No rule to make target `../include/hellomake.h', needed by `obj/hellomake.o'.
make: Target `obj/hellomake.o' not remade because of errors

还有其他建议吗?

提前致谢!

最佳答案

修复错误 make: *** 没有规则来制作目标 'obj/hellomake.o','hellomake' 需要。停止。

改变这一行:

$(ODIR)/%.o: %.c $(DEPS) 

收件人:

$(OBJ): $(ODIR)/%.o: src/%.c $(DEPS)

这为 $(OBJ) 变量中的所有对象创建了一个规则。第二个参数 ('$(ODIR)/%.o') 从完整路径中提取文件名,以便仅将文件名传递给第三个参数 ('src/% .c').

关于c - Makefile C 子目录规则来制作 obj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12711154/

相关文章:

c - 如何生成8字节的十六进制值?

haskell - G-machine,(非)严格上下文 - 为什么 case 表达式需要特殊处理

Xcode:如何编译 i386、armv7、armv7s 和 arm64?

c - cast 中的中间指针必须是 "const qualified"- 为什么?

c - 再次 float

c - 在两个模块之间共享 sizeof(array)

dom - 在React组件中关注输入字段–尝试创建引用时出现类型错误

Java 小时到分钟 简单转换

c++ - 无法在 Linux 上编译 C++ 代码,但可以在 Mac OS 上编译

c - 如何检测 FreeRTOS 中的内存泄漏