尝试运行我的makefile时(https://pastebin.com/CYqsYtj9),我遇到一个错误:
C:/STM32_Projects/blink_project/test/cpputest/build/MakefileWorker.mk:485: *** multiple target patterns. Stop.
我还要链接MakefileWorker.mk(https://pastebin.com/5JSy3HsB),尽管我很确定它写得很好,因为它来自https://github.com/cpputest/
所以,问题是:为什么我会出现这个错误?
编辑:当我试图从Cygwin CLI生成makefile时,我得到的错误如下:
C://STM32_Projects/blink_project//test/cpputest/build/MakefileWorker.mk:485: *** target pattern contains no '%'. Stop.
编辑2(最小、可验证的示例(:
// test/main.cpp
#include "CppUTest/CommandLineTestRunner.h"
int main (int ac, char ** av){
return CommandLineTestRunner::RunAllTests(ac,av);
}
所以这是一个简单的main.cpp,我的makefile应该编译它,除此之外,你还需要一个来自https://github.com/cpputest/cpputest按照该repo中的README所示进行编译。
如前所述,我不是Windows方面的专家,对cygwin的了解更少。
但是,我怀疑您尝试使用的环境在Windows上没有得到很好的支持或测试。我看到的是:
您设置:
PROJECT_DIR=C:/STM32_Projects/blink_project
TEST_DIR=$(PROJECT_DIR)/test
TEST_SRC_DIRS=$(TEST_DIR)
这意味着CCD_ 1被设置为CCD_。
接下来在MakefileWorker.mk中,您会得到一个错误,因为TEST_DEPS
被设置为objs/C:/STM32_Projects/blink_project/test/main.o ...
,我希望我们都能很容易地看到,这是一个完全伪造的路径。
那么我们是如何走上这条路的呢?让我们回顾一下:
在第484行,我们看到TEST_DEPS
是如何设置的:
TEST_DEPS = $(TEST_OBJS) $(MOCKS_OBJS) ...
因此,伪路径很可能在TEST_OBJS
中。设置在第380行:
TEST_OBJS = $(call src_to_o,$(TEST_SRC))
首先,什么是TEST_SRC
?它在第379行被设置为用户定义宏get_src_from_dir_list
和TEST_SRC_DIRS
(您在上面设置(的结果。该宏将定位所有源文件,以便在TEST_SRC_DIRS
3的每个目录中查找与*.cpp
、*.cc
和*.c
匹配的文件。因此,根据info
的输出,我们可以推断这将返回:
C:/STM32_Projects/blink_project/test/main.cpp
这是意料之中的。然后我们将其传递给src_to_o
,它是第363行上的用户定义宏,它使用第362行上定义的另一个用户定义宏src_to
:
src_to = $(addprefix $(CPPUTEST_OBJS_DIR)/,$(call __src_to,$1,$2))
哦!!在第226行,CPPUTEST_OBJS_DIR
被设置为obj
,所以这很可能是我们问题的开始。
在POSIX文件系统中,其中不存在诸如";驱动器号";,路径是完全可构造的:如果你有一个完全限定的路径,你可以通过添加一个新路径作为前缀来创建另一个路径。这在Windows上不起作用,因为Windows必须始终将驱动器号放在第一位。
但让我们继续前进。所以我们看到obj/
前缀来自哪里,现在路径的其余部分来自哪里?这是在第361行定义的用户定义宏C:/STM32_Projects/blink_project/test
0的扩展,从上面的源路径开始。这是干什么的?它想用.o
替换.cpp
扩展。但请注意:
$(if $(CPPUTEST_USE_VPATH),$(notdir $2),$2)
如果CPPUTEST_USE_VPATH
为真,则返回路径的notdir
;这将去掉所有的驱动器和目录信息,只返回main.cpp
,它将变成main.o
,然后结果将是obj/main.o
,它将正常工作。
但是,如果CPPUTEST_USE_VPATH
为false(默认情况下为false(,我们不会去掉路径,并且obj
会被添加到带有驱动器规范的完整路径中,您会得到语法错误。
所以。基本上,cpbutest生成文件在Windows上存在问题。看起来你有一个这样的选择:
将CPPUTEST_USE_VPATH
选项设置为Y
以启用它(并阅读该选项的含义以及如何在cpbutest文档中使用它(,
或者,在makefile中从路径中删除驱动器规格,然后只使用:
PROJECT_DIR = /STM32_Projects/blink_project
这意味着在调用之前,您需要小心您当前的驱动器是C:
,否则它将找不到东西。
啊!