繁体   English   中英

如何运行和执行 makefile C

[英]How to run and execute a makefile C

我正在尝试为我的程序制作 Makefile。 这太难了,因为我已经阅读了很多指南,但没有一个是清楚的。 我有 3 个文件: main.clibrary.clibrary.h Main.c 和 library.c 依赖于 library.h。 我的目录项目的结构由:MyProject 目录-> Build 目录和Exercise1 目录-> 我的所有文件组成。 在编译器中,我编写了make并编译; 然后当我写make execute命令时,它给了我这个错误:

cd ../build; ./test
Error: No such file or directory
makefile:23: recipe for target 'execute' failed
make: *** [execute] Error 1

MAKEFILE

CC=gcc
CFLAGS=-Wall
ODIR=../build
DIR = build

.PHONY: all

all: main.o library.o test

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

library.o: library.c library.h
    $(CC) -std=c99 -c -o $(ODIR)/$@ $< $(CFLAGS)

main.o: main.c library.h
    $(CC) -std=c99 -c -o $(ODIR)/$@ $< $(CFLAGS)

test: $(ODIR)/library.o $(ODIR)/main.o
    $(CC) -std=c99 -o $(ODIR)/$@ $^ $(CFLAGS)

execute:
    cd $(ODIR); ./test

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

这些行:

execute:
    cd $(ODIR); ./test

告诉make ,当你make execute命令时,它应该将工作目录更改为$(ODIR) ,然后执行./test ,这意味着在当前工作目录中执行文件test 但是, $(ODIR)目录中没有文件test ,因为您还没有构建它。

您可以通过执行make test来制作该文件,但这是一种不好的方法。 最好告诉make execute目标取决于$(ODIR)/test

execute: $(ODIR)/test
    cd $(ODIR); ./test

然后我们应该将test的规则更改为$(ODIR)/test

$(ODIR)/test: $(ODIR)/library.o $(ODIR)/main.o
    $(CC) -std=c99 -o $(ODIR)/$@ $^ $(CFLAGS)

接下来,删除all规则和.PHONY规则。 当 makefile 可以制作多个不同的最终目标(如ProgramAProgramBProgramC )并且您想要一个可以实现所有目标的目标时,应该使用适用于all的规则。 它不应用于为目标制作所有中间 object 文件。 中间文件应该来自构建最终目标的规则。

然后删除library.omain.o的规则。 这些是当前目录中文件的名称,但您正在构建$(ODIR) 我们将让$(ODIR)/%.o的模式规则构建它们。

但是我们需要修复模式规则。 它使用DEPS ,但未定义。 在上面添加一行,说明所有 object 文件所依赖的内容:

DEPS=library.h

makefile 中没有任何内容使用DIR ,因此删除该行DIR = build

最后,您可能希望将execute目标放在首位,使其成为默认值。 那么你的 makefile 是:

CC=gcc
CFLAGS=-Wall
ODIR=../build
DEPS=library.h

execute: $(ODIR)/test
    cd $(ODIR); ./test

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

$(ODIR)/test: $(ODIR)/library.o $(ODIR)/main.o
    $(CC) -std=c99 -o $(ODIR)/$@ $^ $(CFLAGS)

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

您还可以更改clean命令以删除test

    rm -f $(ODIR)/*.o $(ODIR)/test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM