Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Terminal 在makefile上运行make不会';不太管用_Terminal_Bash_Shell - Fatal编程技术网

Terminal 在makefile上运行make不会';不太管用

Terminal 在makefile上运行make不会';不太管用,terminal,bash,shell,Terminal,Bash,Shell,我有一个makefile: SHELL=/bin/zsh COMPILER=g++ -g COMPILERSO=g++ -a +a1 -b LIBDIR=/Users/romeovs/Desktop/rootex CFLAGS=$(root-config --cflags) LIBS=$(root-config --libs) -lPhysics -lThread -lMinuit -lHtml -lVMC -lEG -lGeom ROOT=/usr/local/bin/root -b -q

我有一个makefile:

SHELL=/bin/zsh
COMPILER=g++ -g
COMPILERSO=g++ -a +a1 -b
LIBDIR=/Users/romeovs/Desktop/rootex
CFLAGS=$(root-config --cflags)
LIBS=$(root-config --libs) -lPhysics -lThread -lMinuit -lHtml -lVMC -lEG -lGeom
ROOT=/usr/local/bin/root -b -q

.SUFFIXES=.C .o

WriteTree : WriteTree.C Event.o Event_C.so Event.h
    ${COMPILER} WriteTree.C -o  $@ Event.o Event_C.so ${CFLAGS} ${LIBS}
Event_C.so : BuildLibDico.C
     ${ROOT} BuildLibDico.C
Event.o : Event.C Event.h
    ${COMPILER} -c ${CFLAGS} Event.C 
当我在命令行中运行
makeevent.o
int时,人们会期望
make
会运行:

${COMPILER} -c ${CFLAGS} -o Event.o Event.C
应该扩展到

g++ -g -c $(root-config --cflags) -o Event.o Event.C
这反过来应该扩展
$(根配置--cflags)

然而,当我这样做时,
make
欢呼:

g++     -c -o Event.o Event.C
(注意
g++
-c
之间的额外空格)。当然,这反过来会导致编译错误

看来扩展好像不能正常工作。运行:

g++ -c $(root-config --cflags) -o Event.o Event.C 
但它确实有效

我能做些什么来解决这个问题


编辑

问题的一部分由Gilles的答案解决

问题的另一部分是
make
实际上没有在目录中查找makefile(它被称为
WriteTree.make
),而是在运行基本的
g++
命令

这可以通过使用
make-f WriteTree.make Event.o来修复,但我不知道这是否是好的
make
行为(我真的希望它自己寻找makefile,不仅是
makefile
,而且每个
*.make
)。

CFLAGS=$(根配置--CFLAGS)
CFLAGS
设置为具有奇怪名称的make变量的值
根配置--CFLAGS
。因为没有这样的变量,所以展开式是空的。请注意,make接受
${variable\u name}
$(variable\u name)
,如果
$
后面的字符不是左括号或大括号,则将其用作变量名(即使
$foo
扩展为名为
f
的变量值,后面紧跟两个字符
oo

您需要将美元符号加倍:
$$
展开为单个
$
,然后您将得到一个shell代码段

CFLAGS = $$(root-config --cflags)
LIBS = $$(root-config --libs) -lPhysics -lThread -lMinuit -lHtml -lVMC -lEG -lGeom
另一个错误是
.suffix=.C.o
应该使用冒号而不是等号:
.suffix:.C.o
。这在这里并不重要,因为您没有隐式规则

最后,make查找
Makefile
(或带有一些实现的
Makefile
;GNU make首先尝试
GNUmakefile
)。Make在任何情况下都只读取一个makefile(不计算通过
include
指令到达的文件)。如果要使用不同的makefile,则需要在命令行中使用
-f
选项显式指定它。如果你想把你的规则分成几个makesfiles,写一个包含所有规则的主makefile;请注意,makefile将为目标和变量共享一个名称空间。在GNU make中,您可以包含由通配符模式匹配的所有文件:

include $(wildcard *.make)
请注意,文件名相对于您从中调用的当前目录。如果要查找与makefile位于同一目录中的文件,则需要明确指出:

include $(wildcard $(dirname $(lastword $(MAKEFILE_LIST)))/*.make)

好的,检查我的更新。它解释了您答案的最后一段。@romeovs如果要将定义和规则拆分为多个文件,您仍然需要编写一个主makefile,或者使用
-f
传递单个makefile的名称。