CXX = g++
CXXFLAGS = -std=c++11 -Wall
OBJECTS = foo.o bar.o baz.o
main: $(OBJECTS)
$(CXX)
testBuild: main
$(CXX) $(CXXFLAGS) -Itest/catch/catch.hpp -o test/TestCase $(OBJECTS) test/TestCase.cpp
test: clean testBuild
test/TestCase --success
clean:
$(RM) *.o *.gch main test/TestCase
我正在尝试写入我的make文件,但是由于某些原因,我不断收到错误消息:
rm -f *.o *.gch main test/TestCase
make: *** No rule to make target 'foo.o', needed by 'main'. Stop.
我看不到我所缺少的内容,可以使用一些帮助。我有3个.hpp类文件,根本没有为每个文件创建一个.cpp,而是使用TestCase.cpp和catch.hpp文件。我已经尝试了上述Makefile的几种不同变体,但尚未获得有效的表格。让我知道您是否需要其他信息。 TestCase.cpp如下:
// Let Catch provide main():
#define CATCH_CONFIG_MAIN
#include <vector>
#include "catch/catch.hpp"
#include "../foo.hpp"
#include "../bar.hpp"
#include "../baz.hpp"
TEST_CASE("Test Classes. PASS.")
{
REQUIRE (Foo::GetMagicNumber() == 12);
Bar b = Bar("Hello");
REQUIRE (b.GetString() == "Hello");
Baz *baz = new Baz(90.0 / 9);
REQUIRE ((baz->GetValue() > 9.999 && baz->GetValue() < 10.0001));
}
// Compile & run:
// make clean test
答案 0 :(得分:1)
在没有用于制作foo.o
的明确规则的情况下,make会尝试使用隐式模式规则来尝试为您构建它(为简单起见,省略了一些额外的可能步骤),并且当它用尽了所有想法时,它将失败并显示您看到的错误消息。
换句话说。在您的情况下,make既找不到foo.o
也无法建立。可能会搜索foo.c
,foo.cpp
,foo.C
,...。通过运行make
和--debug=i
,可以获得完整的列表。
您必须确保所有源都可用于预期链接主文件的所有文件(即,可以为其生成$(OBJECTS)
对象文件)。或将该列表简化为实际可用和所需的文件列表。
还请注意,一旦清除此障碍,您的make文件将不会链接可执行文件,原因是:
main: $(OBJECTS)
$(CXX)
一旦所有先决条件都可用并且可以构建main
,它将运行g++
并失败,因为未指定任何输入,至少您可能想说些类似的话:
main: $(OBJECTS)
$(CXX) -o $@ $+
使用目标名称(g++
)作为输出,并使用所有先决条件(main
)作为输入来启动$(OBJECTS)
。