【问题标题】:Makefile compile with list of .cppMakefile 使用 .cpp 列表编译
【发布时间】:2021-04-21 13:31:59
【问题描述】:

可以用 make 编译一个 .cpp 列表吗? 在我的生成文件中,我有 2 个列表,一个是 .o,第二个是 .cpp。 .o 的列表与具有不同路径的 .cpp 相同。 我不能使用 vpath,因为我有多个同名的 .cpp。

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

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

在这种情况下,我的 .cpp 对于所有 .o 都是相同的。

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

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)

【问题讨论】:

  • 您似乎将所有不同源目录中的所有目标文件放入 single 输出目录,但您在不同源中也有同名的源文件目录。那是行不通的。
  • 对不起,我的例子错了,我没有编译相同的 .cpp 但是,我在 AAA/BBB/CC/dd/ 目录中有一个 cc.cpp,但我想编译AAA/BBB/的cc.cpp,没有vpath函数

标签: c++ makefile gnu-make


【解决方案1】:

那条规则……真的是错误的。目标是目标文件,但您使用的配方是生成可执行文件的链接命令,而不是生成目标文件的编译命令。

除非我们知道SRCOBJS 变量的内容,否则我们真的无能为力。

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

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

(如果您要从目标文件创建的程序的名称是program)。

预计到达时间

如果没有算法方法可以可靠地将目标文件名转换为单个已知源文件,那么您就无法编写能够完成这项工作的模式规则。

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

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

$(for S,$(SRCS),$(eval $(PATH_BUILD)/$(notdir $(S:%.cpp=%.o)): $S))

这创建了一种构建每个目标文件的方法,然后根据其相关的 .c 文件为每个 .o 文件编写一组单独的依赖项。

【讨论】:

  • .o 有不同的路径,我已经编辑了我的帖子以添加示例。如果我没有定义构建对象的规则,则会出现错误“No rule to make target XXX/xx.o”
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多