Makefile看不到我的隐式规则
我试图使世界变得最简单(相对通用)Makefile看不到我的隐式规则,makefile,gnu-make,Makefile,Gnu Make,我试图使世界变得最简单(相对通用)Makefile。我可以用它来驱动一系列小测试来学习C。出于某种原因,Makefile拒绝理解我的隐式规则,以使对象文件形成C:%.o:%.C,我没有规则来生成目标%.o,这是test1.exe所需要的。下面是我的Makefile的全部内容: INC = sglib CC = gcc LD = gcc LDFLAGS = # On MS-Windows, say "make os=win" to set proper extensio
Makefile
。我可以用它来驱动一系列小测试来学习C。出于某种原因,Makefile
拒绝理解我的隐式规则,以使对象文件形成C:%.o:%.C
,我没有规则来生成目标%.o,这是test1.exe
所需要的。下面是我的Makefile
的全部内容:
INC = sglib
CC = gcc
LD = gcc
LDFLAGS =
# On MS-Windows, say "make os=win" to set proper extensions
os =
SO =
EXE =
ifeq ($(os), win)
SO = dll
EXE = .exe
# -fPIC is a no-op on Windows, but causes a compiler warning
CFLAGS = -std=gnu99 -ggdb3 -Wall
else
SO = so
CFLAGS = -std=gnu99 -ggdb3 -Wall -fPIC
endif
all: test1$(EXE)
test1$(EXE): %.o
$(LD) $< -o $@
lib-test.$(SO): %.o
$(LD) -shared $(LDFLAGS) -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -I$(INC) -c $< -o $@
check:
echo Nothing yet!
.PHONY: all clean
clean:
rm -f *.o *.$(SO) test1$(EXE)
INC=sglib
CC=gcc
LD=gcc
LDFLAGS=
#在MS Windows上,说“make os=win”以设置适当的扩展
操作系统=
因此=
EXE=
ifeq($(操作系统),win)
SO=dll
EXE=.EXE
#-fPIC是Windows上的no op,但会导致编译器警告
CFLAGS=-std=gnu99-ggdb3-Wall
其他的
某某
CFLAGS=-std=gnu99-ggdb3-Wall-fPIC
恩迪夫
全部:test1$(EXE)
test1$(EXE):%.o
$(LD)$<-o$@
lib测试。$(SO):%.o
$(LD)-共享$(LDFLAGS)-o$@$<
%.o:%.c
$(CC)$(CFLAGS)-I$(INC)-c$<-o$@
检查:
还没有回音!
.骗子:都是干净的
清洁:
rm-f*.o*$(SO)test1$(EXE)
我在windows 20上使用gnu make 4.2.1和gcc 6.2.0。我不知道那里出了什么问题。这可能很简单,但我现在似乎是瞎子。你似乎认为在这样的规则中:
test1$(EXE): %.o
%符号是导致文件名扩展的通配符-不是。如果要创建.o文件列表,应使用内置的通配符
函数
我有几篇关于通用makefiles的博客文章,开头可能有用(也可能不有用)。您似乎认为在这样的规则中:
test1$(EXE): %.o
%符号是导致文件名扩展的通配符-不是。如果要创建.o文件列表,应使用内置的通配符
函数
我有几篇关于通用makefiles的博客文章,开头可能有用(也可能不有用)。这:
test1$(EXE): %.o
定义一条规则,说明目标test1
的先决条件是文件%.o
。不是一些对象文件的通配符列表。特别是名为%.o
的文件。您的makefile中没有其他创建该文件的规则,并且它当前不存在,因此会出现错误
%
仅在(以及类似的函数,如patsubst
)中充当占位符,这是目标中出现%
的规则。因此,你的:
%.o : %.cpp
$(CC) $(CFLAGS) -I$(INC) -c $< -o $@
但这实际上也不起作用。当您第一次尝试构建时,还没有任何对象文件存在。清晰地因此,$(通配符*.o)
将返回一个空字符串,结果将是胡说八道。所以你不能通配符。您需要显式提供该字符串:
test1$(EXE) : $(object_files)
$(LD) $< -o $@
现在,如果您有像foo.c
、bar.c
和baz.c
这样的源文件,$(通配符)
函数将找到它们并将源文件设置为foo.c bar.c baz.c
。下一行的替换将object\u files
设置为foo.o bar.o baz.o
。因此,根据这三个对象文件,我们最终得到了test
,并且您已经有了构建这些对象文件的模式规则 这是:
test1$(EXE): %.o
定义一条规则,说明目标test1
的先决条件是文件%.o
。不是一些对象文件的通配符列表。特别是名为%.o
的文件。您的makefile中没有其他创建该文件的规则,并且它当前不存在,因此会出现错误
%
仅在(以及类似的函数,如patsubst
)中充当占位符,这是目标中出现%
的规则。因此,你的:
%.o : %.cpp
$(CC) $(CFLAGS) -I$(INC) -c $< -o $@
但这实际上也不起作用。当您第一次尝试构建时,还没有任何对象文件存在。清晰地因此,$(通配符*.o)
将返回一个空字符串,结果将是胡说八道。所以你不能通配符。您需要显式提供该字符串:
test1$(EXE) : $(object_files)
$(LD) $< -o $@
现在,如果您有像foo.c
、bar.c
和baz.c
这样的源文件,$(通配符)
函数将找到它们并将源文件设置为foo.c bar.c baz.c
。下一行的替换将object\u files
设置为foo.o bar.o baz.o
。因此,根据这三个对象文件,我们最终得到了test
,并且您已经有了构建这些对象文件的模式规则 %.o:%.c
告诉Make它可以编译anything.c
来获得anything.o
。但是,test1$(EXE):%.o
告诉Make它可以链接%.o
(使用该规则编译%.c
)以获取test1$(EXE)
。你有名为%.c
的文件吗?哇!老实说,我不明白你们在这里干什么。“请使用问题上的编辑链接添加其他信息。回答后按钮应仅用于问题的完整答案。-6小时前来自评论–Morten Jensen”我不想添加其他信息,我想感谢那些回复我帖子的人,确认他们对我很有帮助,并给我指出了正确的位置。现在我甚至被禁止发布anwers:-)。我很困惑,但无论如何,谢谢你的帮助,祝你过得愉快,祝大家生活愉快。@user1648090你感谢那些回答了的人的方式是投票给他们的答案和/或接受最有帮助的答案。看见另外,请看一下。@user1648090您的答案被否决的原因是因为它们不是好答案。人们可以回答自己的问题,但答案的标准是相同的,就好像你不是问问题的那个人一样。回滚。得到答案后,您不得更改问题(这并不禁止添加相关信息),因为这样会使问题没有上下文。如果你不想