![](/img/trans.png)
[英]How to “execute” Makefile in Ubuntu to run C program that reads from stdin and outputs to stdout/stderr
[英]How to run and execute a makefile C
我正在尝试为我的程序制作 Makefile。 这太难了,因为我已经阅读了很多指南,但没有一个是清楚的。 我有 3 个文件: main.c
, library.c
, library.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 可以制作多个不同的最终目标(如ProgramA
、 ProgramB
和ProgramC
)并且您想要一个可以实现所有目标的目标时,应该使用适用于all
的规则。 它不应用于为目标制作所有中间 object 文件。 中间文件应该来自构建最终目标的规则。
然后删除library.o
和main.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.