Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile看不到我的隐式规则_Makefile_Gnu Make - Fatal编程技术网

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您的答案被否决的原因是因为它们不是好答案。人们可以回答自己的问题,但答案的标准是相同的,就好像你不是问问题的那个人一样。回滚。得到答案后,您不得更改问题(这并不禁止添加相关信息),因为这样会使问题没有上下文。如果你不想