gpt4 book ai didi

linux - 使找不到规则

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:44 25 4
gpt4 key购买 nike

也许我遗漏了一些东西,但是这个 make 文件失败了,出现错误(由于本地化的解释是活跃的):

there is no rule to build target ****.o

其中 **** 是现有 .cpp 文件的名称。制作版本 3.81,gcc 4.7.5(如果相关的话)。

这是生成文件。

program_name := librlsmatt.a
source_dirs := ../src
include_dirs := $(source_dirs)

CXX = g++
AR = ar

WARNS := -Wall -Wno-deprecated -Wno-unused -Wno-unused-parameter
CFLAGS:= $(addprefix -I, $(include_dirs)) $(WARNS) -fstack-protector-all -g
ARFLAGS := cru

source_files := $(wildcard $(addsuffix /*.cpp, $(source_dirs) ) )
object_files := $(notdir $(source_files:.cpp=.o) )
dep_files := $(object_files:%.o=%.d)

.PHONY : clean

-include $(dep_files)

$(program_name): $(object_files)
$(info Linking ...)
@$(AR) $(ARFLAGS) $@ $(object_files)

%.o: %.cpp makefile
$(info Compiling $< ...)
@$(CXX) -c $(CFLAGS) $< -o $@ -MF $(@:%.o=%.d) -MT $@

clean:
$(info Clean $(program_name)...)
@$(RM) -f $(program_name) $(object_files) $(dep_files)

最佳答案

首先,请注意 Makefile 中的默认目标是第一个;因此,如果我们存在依赖文件,并且我们在主要目标之前包含它们,那么第一个包含的依赖规则中的 .o 目标将是默认目标。根据经验,在更靠后的位置包含依赖项,例如最后。

这个Makefile中的模式匹配问题是因为.o文件没有目录前缀,因为使用了$(notdir ...) 在生成它们的扩展中,但是 .cpp 文件会。

make 正在尝试构建一些 foo.o 并且 %.o: %.cpp 规则告诉它寻找 foo.cpp。但是没有foo.cpp;存在的是一些 src/dir/foo.cpp

如果您真的希望.o 文件位于一个目录中,VPATH 机制可能是一种可能。如果 src/dirVPATH 中,那么当 make 寻找 foo.cpp 来更新 foo.o,它将在 src/dir 中找到它。

如果将树中的所有 .o 文件强制放入一个目录中,则必须确保没有两个同名的 .cpp 文件。

如果你想将 .o 文件放在源代码树之外(这很有用,因为你可以有一个只读的源代码树,例如),最好镜像输出树中源树的结构,如下所示:

$(OUTPUT_DIR)/%.o: %.cpp:   # where the % stem is src/dir/whatever/foo

思路是目标文件是$(OUTPUT_DIR)/src/whatever/foo.o,源文件是src/whatever/foo.cpp .

配方必须确保目录$(OUTPUT_DIR)/src/whatever 存在;所以在某处需要一个 mkdir -p 命令:

$(OUTPUT_DIR)/%.o: %.cpp:
$(info Compiling $< ...)
@mkdir -p $(dir $@)
@$(CXX) -c $(CFLAGS) $< -o $@ -MF $(@:%.o=%.d) -MT $@

关于linux - 使找不到规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com