Linux Makefile缺少一条看起来可用的规则
我有以下的MaFo文件,用于在当前目录中建立Linux的项目“代码>串行.c/c>,但是使用C++内部的代码库> SRC 和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
#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,我的答案不会有太大的不同,所以请随意接受这个答案。:-)