Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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_Ubuntu 18.04 - Fatal编程技术网

Makefile 为什么不';在我的源文件中不迭代?

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/

我为我的项目创建了一个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/
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).
规则并将其替换为上述模式规则,它将如我所述正常工作。