Makefile 从文件列表中查找特定的源文件

Makefile 从文件列表中查找特定的源文件,makefile,Makefile,我有下面的makefile 目标:调试 调试:$BIN_debug/$TARGET_NAME.lib BIN_DEBUG是调试文件夹的路径 TARGET_NAME是库名称。 .libs的规则 $BIN\u DEBUG/$TARGET\u NAME.lib:$DEBUG\u OBJECT\u LIST $LIB/OUT:$@$^ DEBUG_OBJECT_LIST是BIN_DEBUG文件夹中的.obj文件列表。 obj文件的规则 $DEBUG\u OBJECT\u LIST:$BIN\u DEBU

我有下面的makefile

目标:调试 调试:$BIN_debug/$TARGET_NAME.lib BIN_DEBUG是调试文件夹的路径 TARGET_NAME是库名称。 .libs的规则 $BIN\u DEBUG/$TARGET\u NAME.lib:$DEBUG\u OBJECT\u LIST $LIB/OUT:$@$^ DEBUG_OBJECT_LIST是BIN_DEBUG文件夹中的.obj文件列表。 obj文件的规则 $DEBUG\u OBJECT\u LIST:$BIN\u DEBUG/%.obj:%.cpp @cl/c/Z7/W3/Od/D_UNICODE/D UNICODE/Gm/EHsc/Fo$@/Gd/analyze-/errorReport:queue$CFLAGS$^ 在每个obj文件的规则中,我想为obj文件选择相应的文件。我在源列表中有文件列表。 它显示了如何派生调试对象列表。 DEBUG_OBJECT_LIST1=$patsubst%.cpp、%.obj、$SOURCE_LIST DEBUG\u OBJECT\u LIST2=$notdir$DEBUG\u OBJECT\u LIST1 DEBUG_OBJECT_LIST=$patsubst%,$BIN_DEBUG/%,$DEBUG_OBJECT_LIST2
我需要obj文件规则方面的帮助。如何为给定的obj文件提取准确的文件?

好的,一般的第一点是很棘手的,而且对空白非常敏感

patsubst命令不应在逗号后包含空格。现在,在这种情况下,它不应该有什么区别,因为你所要做的就是在项目之间添加一个额外的空间,但我可以保证,如果你不消除这个习惯,当你在做一个更大、更复杂的构建时,它会回来咬你

obj文件的规则过于复杂

$(DEBUG_OBJECT_LIST):$(BIN_DEBUG)/%.obj:%.cpp
    @cl ... $^
一个更简单的模式规则将完成这项工作:

$(BIN_DEBUG)/%.obj: %.cpp
    @cl ... $<
只需不首先将目录添加到列表中,就可以轻松地筛选出目录。如果不使用通配符(通配符或**构造),这很容易。通配符似乎是个好主意;这很方便,但它们实际上会产生比它们解决的问题更多的问题,包括目录、非源文件、您目前不想编译的文件——只要咬紧牙关,手动将源文件添加到源列表中即可


编辑:更正错误wrt。静态模式规则。正确的输入错误。

通过设置VPATH变量,问题得以解决。请查找更多关于


你能给我们一个你想用这个文件做什么的例子吗?在源文件夹中有一堆cpp文件,每个文件可能在不同的子文件夹中。我想把它们编译成一个.lib。在其他操作系统上也可以这样做。规则A.o B.o:%.o:%.cpp是有效的,并且表示仅对第一个冒号之前的文件使用此模式。并且$^扩展到目标的所有依赖项。换句话说,你对错误规则的批评是错误的。好吧,很高兴知道,但即使如此,对于手头的任务来说,它也不必要地复杂。我知道$^扩展到了所有的先决条件-我的观点是你可能不应该在模式规则中使用它,因为它会阻止你这样做%.o:%.c Makefile一些其他文件是需要的,但不应该提供给编译器。我强烈反对使用VPATH。如果应该使用VPATH,那么它应该用于查找库和头,而不是源文件。请注意,kbuild Linux内核构建系统只使用一条VPATH语句,该语句被设置为正好1或2个目录:cwd和外部构建模块的路径(如果您正在构建)。如果VPATH是答案,那么问题是在对象文件名中没有包含path元素,例如foo.c而不是src/path/foo.c。
DEBUG_OBJECT_LIST = $(patsubst %.cpp,$(BIN_DEBUG)/%.obj,$(SOURCE_LIST))
SRC_DIR_LIST    = $(dir $(SOURCE_LIST))
VPATH           = $(sort $(SRC_DIR_LIST))