C++ 使用.cpp列表编译Makefile
可以用make编写.cpp的列表吗? 在我的makefile中有两个列表,一个是.o,第二个是.cpp。 .o的列表与.cpp的列表相同,但路径不同。 我无法使用vpath,因为我有多个同名的.cpp 我可以浏览.o,但不能浏览.cpp: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
$(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函数