正确编写我的C++ Mag文件的问题

正确编写我的C++ Mag文件的问题,c++,makefile,C++,Makefile,我正在尝试写入make文件,但由于某些原因,我一直收到一个错误: rm-f*.o*.gch主测试/测试用例 make:**没有规则将目标设置为'foo.o',这是'main'所需要的。停止 我看不出我遗漏了什么,需要一些帮助。我有3.hpp类文件,没有为每个文件创建.cpp,而是使用TestCase.cpp和catch.hpp文件。我已经尝试了上述Makefile的几种不同变体,但还没有得到一个工作表单。如果您需要任何其他信息,请告诉我。TestCase.cpp如下所示: CXX = g++

我正在尝试写入make文件,但由于某些原因,我一直收到一个错误:

rm-f*.o*.gch主测试/测试用例 make:**没有规则将目标设置为'foo.o',这是'main'所需要的。停止 我看不出我遗漏了什么,需要一些帮助。我有3.hpp类文件,没有为每个文件创建.cpp,而是使用TestCase.cpp和catch.hpp文件。我已经尝试了上述Makefile的几种不同变体,但还没有得到一个工作表单。如果您需要任何其他信息,请告诉我。TestCase.cpp如下所示:

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

在没有显式规则生成foo.o的情况下,make将尝试隐式模式规则来尝试为您构建它。为了简单起见,几乎没有其他可能的步骤被省略,并且当它没有想法时,它将失败并显示您看到的错误消息

换句话说。在您的情况下,make既找不到foo.o,也无法构建。它可能会搜索foo.c、foo.cpp、foo.c。。。通过使用-debug=i运行make,可以获得完整的列表

您必须确保所有源可用于所有预期链接main的文件,即可为其生成$OBJECTS对象文件的文件。或者将该列表减少为实际可用和需要的文件列表

另外,请注意,一旦您清除此障碍,make文件将不会链接您的可执行文件,因为:

// 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
一旦所有先决条件都可用并且可以构建main,它将只运行g++并失败,因为没有指定输入,至少您可能会说:

main: $(OBJECTS)
        $(CXX)

使用target name main作为输出和所有先决条件$OBJECTS作为输入来启动g++。

您的生成文件没有任何规则来生成任何对象文件。另外,main的规则实际上什么都不做。它只调用g++而没有参数。另外,vim标记似乎对这个问题没有任何作用。您知道如何手动编译代码吗,即不使用makefile?如果您的目标不是学习makefile,而只是使用makefile,我建议您使用
main: $(OBJECTS)
        $(CXX) -o $@ $+