程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Makefile 使用 .cpp 列表编译大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Makefile 使用 .cpp 列表编译?

开发过程中遇到Makefile 使用 .cpp 列表编译的问题如何解决?下面主要结合日常开发的经验,给出你关于Makefile 使用 .cpp 列表编译的解决方法建议,希望对你解决Makefile 使用 .cpp 列表编译有所启发或帮助;

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

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

$(OBJs): $(SRC)
     $(linkER) -g -o $@ $^ $(LDFLAGS)

在这种情况下,我的 .cpp 对所有 .o. 都是一样的。

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

@H_976_2@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)

解决方法

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

除非我们知道 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))

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

大佬总结

以上是大佬教程为你收集整理的Makefile 使用 .cpp 列表编译全部内容,希望文章能够帮你解决Makefile 使用 .cpp 列表编译所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:.cpp使用