Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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
C++ 使用.cpp列表编译Makefile_C++_Makefile_Gnu Make - Fatal编程技术网

C++ 使用.cpp列表编译Makefile

C++ 使用.cpp列表编译Makefile,c++,makefile,gnu-make,C++,Makefile,Gnu Make,可以用make编写.cpp的列表吗? 在我的makefile中有两个列表,一个是.o,第二个是.cpp。 .o的列表与.cpp的列表相同,但路径不同。 我无法使用vpath,因为我有多个同名的.cpp 我可以浏览.o,但不能浏览.cpp: $(OBJS): $(SRC) $(LINKER) -g -o $@ $^ $(LDFLAGS) 在本例中,我的.cpp对于所有.o都是相同的 $(OBJS)是.cpp的.o和$(SRC)的列表 Makefile的示例: COMPILATEUR=g

可以用make编写.cpp的列表吗? 在我的makefile中有两个列表,一个是.o,第二个是.cpp。 .o的列表与.cpp的列表相同,但路径不同。 我无法使用vpath,因为我有多个同名的.cpp

我可以浏览.o,但不能浏览.cpp:

$(OBJS): $(SRC)
     $(LINKER) -g -o $@ $^ $(LDFLAGS)
在本例中,我的.cpp对于所有.o都是相同的

$(OBJS)是.cpp的.o和$(SRC)的列表

Makefile的示例:

COMPILATEUR=g++
LINKER=g++
LDFLAGS=
CFLAGS=-Og
PATH_BUILD=$(pwd)/Build/
EXE=Bidou

INCLUDES= -I"AAA/BBB" \
    -I"AAA/BBB/CC/dd"

SRC= AAA/BBB/CC/dd.cpp \
     AAA/BBB/hh.cpp \
     AAA/BBB/CC/dd/ee.cpp \
     AAA/BBB/cc.cpp

OBJS:= $(addprefix $(PATH_BUILD)/,$(notdir $(SRC:%.cpp=%.o)))

$(OBJS): $(SRC)
    @mkdir -p $(PATH_BUILD)
    @echo "\n##$<"
    $(COMPILATEUR) $(INCLUDES) $(CFLAGS) "$<" -g -c -o $@

$(EXE): $(OBJS)
    $(LINKER) -g -o $@ $^ $(LDFLAGS)

clean:
    rm -fr $(PATH_BUILD)
compileateur=g++
链接器=g++
LDFLAGS=
CFLAGS=-Og
路径\构建=$(pwd)/构建/
EXE=Bidou
包括=-I“AAA/BBB”\
-I“AAA/BBB/CC/dd”
SRC=AAA/BBB/CC/dd.cpp\
AAA/BBB/hh.cpp\
AAA/BBB/CC/dd/ee.cpp\
AAA/BBB/cc.cpp
OBJS:=$(addprefix$(路径构建)/,$(notdir$(SRC:%.cpp=%.o)))
$(OBJS):$(SRC)
@mkdir-p$(路径构建)

@echo“\n##$该规则…确实错误。目标是对象文件,但您使用的配方是生成可执行文件的链接命令,而不是生成对象文件的编译命令

除非我们知道
SRC
OBJS
变量的内容,否则我们真的无法为您提供太多帮助

例如,如果事实上所有的目标文件都有到源文件的相同路径,只是扩展名从
.cpp
更改为
.o
,那么您甚至不需要定义规则来构建这些目标文件:make有一个内置的规则来实现这一点;您可以编写:

program: $(OBJS)
        $(LINKER) -g -o $@ $^ $(LDFLAGS)
(如果要从对象文件创建的程序名为
program

ETA

如果没有算法方法可靠地将对象文件名转换为单个已知源文件,那么就无法编写一个模式规则来完成这项工作

这意味着您必须手工写出所有依赖关系。您可以这样做:

$(OBJS) :
        @mkdir -p $(@D)
        @echo "\n##$<"
        $(COMPILATEUR) $(INCLUDES) $(CFLAGS) "$<" -g -c -o $@

$(for S,$(SRCS),$(eval $(PATH_BUILD)/$(notdir $(S:%.cpp=%.o)): $S))
$(OBJS):
@mkdir-p$(@D)

@echo“\n##$The.o如果有不同的路径,我已编辑我的帖子以添加示例。如果我没有定义构建对象的规则,我会出现一个错误“No rule to make target XXX/xx.o”。您似乎将所有不同源目录中的所有对象文件放在一个输出目录中,但在不同的源目录中也有同名的源文件。那不行。对不起,我在我的示例中出错了,我没有编译相同的.cpp,但是,我在AAA/BBB/cc/dd/目录中有一个cc.cpp,但是我想编译AAA/BBB/的cc.cpp,但没有vpath函数