正确编写我的c ++ Makefile

时间:2019-01-18 22:01:22

标签: c++ makefile

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

1 个答案:

答案 0 :(得分:1)

在没有用于制作foo.o的明确规则的情况下,make会尝试使用隐式模式规则来尝试为您构建它(为简单起见,省略了一些额外的可能步骤),并且当它用尽了所有想法时,它将失败并显示您看到的错误消息。

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

您必须确保所有源都可用于预期链接主文件的所有文件(即,可以为其生成$(OBJECTS)对象文件)。或将该列表简化为实际可用和所需的文件列表。

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

main: $(OBJECTS)
        $(CXX)

一旦所有先决条件都可用并且可以构建main,它将运行g++并失败,因为未指定任何输入,至少您可能想说些类似的话:

main: $(OBJECTS)
        $(CXX) -o $@ $+

使用目标名称(g++)作为输出,并使用所有先决条件(main)作为输入来启动$(OBJECTS)