Makefile 为什么不';在我的源文件中不迭代?
我为我的项目创建了一个makefile,但是make不会遍历我的源文件。我不知道我能做些什么来解决这个问题 我的目录中有2个源文件 生成文件:Makefile 为什么不';在我的源文件中不迭代?,makefile,ubuntu-18.04,Makefile,Ubuntu 18.04,我为我的项目创建了一个makefile,但是make不会遍历我的源文件。我不知道我能做些什么来解决这个问题 我的目录中有2个源文件 生成文件: LIBNAME=hazelicious FLIBNAME=lib$(LIBNAME).so VERSION= CC=g++ CXXFLAGS=-W -Wall -O2 -std=c++17 -fPIC -I./vendor/spdlog/include/ LDFLAGS=-shared -Wl,-soname,$(FLIBNAME) DSRC=src/
LIBNAME=hazelicious
FLIBNAME=lib$(LIBNAME).so
VERSION=
CC=g++
CXXFLAGS=-W -Wall -O2 -std=c++17 -fPIC -I./vendor/spdlog/include/
LDFLAGS=-shared -Wl,-soname,$(FLIBNAME)
DSRC=src/
DTGT=
DOBJ=$(DTGT)obj/
DOUT=$(DTGT)bin/
EXEC=$(DOUT)$(APPNAME)
SRC= $(wildcard $(DSRC)**/*.cpp)
OBJ= $(subst $(DSRC), $(DOBJ), $(patsubst %.cpp, %.o, $(SRC)))
all: $(FLIBNAME)
install:
@sudo cp $(DOUT)$(FLIBNAME) /usr/local/lib/
@sudo cp $(DSRC)Hazelicious.h /usr/local/include/
@echo "Library and header files copied!"
$(FLIBNAME): $(OBJ)
@mkdir -p $(DOUT)
@$(CC) -o $(DOUT)$@ $^ $(LDFLAGS)
$(OBJ): $(SRC)
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
checkvar:
@echo $(SRC)
@echo $(OBJ)
clean:
@rm -rf $(DOBJ)
@rm -rf $(EXEC)
run:
@./$(EXEC)
如您所见,第二行采用相同的Log.cpp
文件
我的目录结构:
/src
/Hazelicious
Application.cpp
Log.cpp
...
/obj
/Hazelicicous
/bin
如果您希望这样:
SRC= $(wildcard $(DSRC)**/*.cpp)
要在$(DSRC)
的所有子目录中查找所有.cpp
文件,您会感到失望。**
特殊的globbing序列是非标准的,仅受某些shell支持(如zsh或bash,如果启用了特殊选项)。它不是POSIX标准全局绑定的一部分,GNU make的通配符函数不支持它。您必须使用标准实现,例如:
SRC := $(shell find $(DSRC) -name \*.cpp)
(这里使用简单的变量赋值(:=
),而不是递归变量赋值(=
),以大大提高效率)
还包括:
OBJ= $(subst $(DSRC), $(DOBJ), $(patsubst %.cpp, %.o, $(SRC)))
会给你带来麻烦,因为<代码>子> <代码>代替所有实例,即使在单词中间,即使单词中有不止一个实例。更好(更简单)的方法是:
您看到相同源文件的原因是您的配方错误:
$(OBJ): $(SRC)
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
当make在显式规则中看到多个目标时,它将其视为多个显式规则,每个目标一个,如下所示:
obj/foo.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
obj/bar.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
obj/biz.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
$(DOBJ)/%.o : $(DSRC)/%.cpp
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
而不是上面明确的规则。这为make提供了一种模式,它可以用来构建与之匹配的任何目标,并列出了关联的.cpp
文件的先决条件。如果您希望:
SRC= $(wildcard $(DSRC)**/*.cpp)
要在$(DSRC)
的所有子目录中查找所有.cpp
文件,您会感到失望。**
特殊的globbing序列是非标准的,仅受某些shell支持(如zsh或bash,如果启用了特殊选项)。它不是POSIX标准全局绑定的一部分,GNU make的通配符函数不支持它。您必须使用标准实现,例如:
SRC := $(shell find $(DSRC) -name \*.cpp)
(这里使用简单的变量赋值(:=
),而不是递归变量赋值(=
),以大大提高效率)
还包括:
OBJ= $(subst $(DSRC), $(DOBJ), $(patsubst %.cpp, %.o, $(SRC)))
会给你带来麻烦,因为<代码>子> <代码>代替所有实例,即使在单词中间,即使单词中有不止一个实例。更好(更简单)的方法是:
您看到相同源文件的原因是您的配方错误:
$(OBJ): $(SRC)
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
当make在显式规则中看到多个目标时,它将其视为多个显式规则,每个目标一个,如下所示:
obj/foo.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
obj/bar.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
obj/biz.o : src/foo.cpp src/bar.cpp src/biz.cpp
mkdir -p $(DOBJ)
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
$(DOBJ)/%.o : $(DSRC)/%.cpp
mkdir -p $(@D)
$(CC) -o $@ -c $< $(CXXFLAGS)
而不是上面明确的规则。这为make提供了一个模式,它可以用来构建与之匹配的任何目标,并列出了相关.cpp
文件的先决条件。超级棒的答案!谢谢你,我学到了很多!但是,$(DSRC)/%.cpp似乎没有返回任何内容。很抱歉,我不理解您的评论,$(DSRC)/%.cpp似乎没有返回任何内容。这是什么意思请注意,在模式规则中使用“%”进行扩展是在读取makefile时进行的任何变量或函数扩展之后进行的。看看如何使用变量和函数来转换文本。我只是想回应一下。对不起,我还是不明白你想说什么。如果有问题,请更清楚地说明。如果您删除您的$(OBJ):$(SRC).
规则并用上面的模式规则替换它,它将如我所述正常工作。超级棒的答案!谢谢你,我学到了很多!但是,$(DSRC)/%.cpp似乎没有返回任何内容。很抱歉,我不理解您的评论,$(DSRC)/%.cpp似乎没有返回任何内容。这是什么意思请注意,在模式规则中使用“%”进行扩展是在读取makefile时进行的任何变量或函数扩展之后进行的。看看如何使用变量和函数来转换文本。我只是想回应一下。对不起,我还是不明白你想说什么。如果有问题,请更清楚地说明。如果删除$(OBJ):$(SRC).
规则并将其替换为上述模式规则,它将如我所述正常工作。