Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Linux Makefile缺少一条看起来可用的规则_Linux_Compilation_Makefile - Fatal编程技术网

Linux Makefile缺少一条看起来可用的规则

Linux Makefile缺少一条看起来可用的规则,linux,compilation,makefile,Linux,Compilation,Makefile,我有以下的MaFo文件,用于在当前目录中建立Linux的项目“代码>串行.c/c>,但是使用C++内部的代码库> SRC 和 > < /COD>,应该将其建立在目录 Obj/中,保持所有文件的清晰和分离。p> #define some paths DHOME = ${HOME}/Serial SRC = ${DHOME}/src INCLUDE = ${DHOME}/include BIN = ${DHOME}/bin OBJ = ${D

我有以下的MaFo文件,用于在当前目录中建立Linux的项目“代码>串行.c/c>,但是使用C++内部的代码库> SRC 和 > < /COD>,应该将其建立在目录<代码> Obj/<代码>中,保持所有文件的清晰和分离。p>
#define some paths
DHOME      = ${HOME}/Serial
SRC        = ${DHOME}/src
INCLUDE    = ${DHOME}/include
BIN        = ${DHOME}/bin
OBJ        = ${DHOME}/obj

# compiler
CFLAGS        = -I$(INCLUDE)
CXX           = g++ -g ${INCLUDE} 
MAKE          = ${CXX} -O -Wall -fPIC -c

$(OBJ)/%.o: $(SRC)/%.cc
    $(MAKE) $(CFLAGS) $< -o ${OBJ}/$@ 

serial: $(OBJ)/%.o
    ${CXX} -o $@ $@.c $< $(CFLAGS) 


.PHONY: clean
clean:
    @rm -f serial $(OBJ)/*.o
但是当查看Makefile时,似乎我已经指定了这个规则(在
serial
规则之上的规则)。我可能错过了一些基本的东西。也许有更好的方法来处理这样一个项目,并让不同的部分在目录中清楚地分开

谢谢,
Alex

模式匹配规则作用于目标

您没有提供要构建的目标列表,因此模式匹配不会像您假设的那样工作

模式匹配不是构造为在命令行上用作通配符的。你不能要求make寻找目标,你必须提供它们

因此,如果
serial
依赖于某些特定的
.o
文件,则需要提供这些文件。最简单的方法是重写规则:

serial: $(OBJ)/foo.o $(OBJ)/bar.o $(OBJ)/fie.o
    #Insert build command here, as needed
serial: $(OBJ)/%.o

这将触发模式匹配,因为在可以链接
serial
之前,每个对象文件都被设置为目标。

问题在于您的规则:

serial: $(OBJ)/foo.o $(OBJ)/bar.o $(OBJ)/fie.o
    #Insert build command here, as needed
serial: $(OBJ)/%.o
由于此规则的目标中没有
%
,因此这不是模式规则。因此,它查找一个名为
/home/alex/Serial/obj/%.o的文件(字面意思),该文件不存在且无法生成

您需要根据实际对象文件名的列表设置序列号。然后模式规则
$(OBJ)/%.o:$(SRC)/%.cc
可以匹配其中的每一个,并将用于编译它

编辑

如果要自动生成该列表,可以对sourcefiles使用glob规则,然后使用模式替换来生成对象文件:

SOURCES = $(wildcard $(SRC)/*.cc)
OBJECTS = $(SOURCES:$(SRC)/%.cc=$(OBJ)/%.o)

看一看make的模式匹配规则,然后再次检查规则。提示是make试图将
%.o
解释为实际的文件名。此外,永远不要在makefile中重载像
MAKE
这样的名称。这是自找麻烦。更进一步,将标志与命令分开,并将
-O-Wall-fPIC-c
位放入
cxflags
中它所属的位置!也许我忽略了一些显而易见的事情?这似乎是可行的,但我想避免列出所有的对象文件。假设我有100个需要链接的对象文件?这将是非常间接的!我想自动提供一个对象列表,比如说,从SRC目录中的cc文件列表。这不是拥有makefile的全部目标吗?否则,我可以在commad行中键入每个gcc命令…@Alex正如EldarAbusalimov在他的评论中所写,你混淆了两个概念。我回答了你的问题,关于为什么你的makefile没有达到你期望的效果。让生成一个文件列表作为构建规则的先决条件是另一回事;我没有使用
c_文件=$(SRC)/Serial.cpp
(效果非常好),而是尝试了
c_文件=$(通配符$(SRC)/%.cpp)
(根本不起作用)。我希望有完全相同的内容。@Alex应该有
c_文件=$(通配符$(SRC)/*.cpp)
,你把make模式和shell globs搞混了。@Eldar终于来了!请把这个和上面的其他东西放在上面,让你得到一个正确的答案…@Alex,我的答案不会有太大的不同,所以请随意接受这个答案。:-)