c++ - 正确编写我的 C++ Makefile 的问题

标签 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

最佳答案

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

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

您必须确保所有源都可用于所有预期链接 main 的文件(即可以生成 $(OBJECTS) 目标文件)。或者将该列表缩减为实际可用和需要的文件列表。

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

main: $(OBJECTS)
        $(CXX)

一旦所有先决条件都可用并且可以构建 main ,它只会运行 g++ 并失败,因为没有指定输入,至少你可能想说像这样的东西:

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

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

关于c++ - 正确编写我的 C++ Makefile 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261993/

相关文章:

c++ - 从 map 中获取值列表

c++ - 使用 std::bind 删除参数

c - 生成文件的问题

c - 使用交叉编译器运行 Makefile 时出错

makefile - OCaml makefile依赖问题

c++ - 给定两个类,我如何概率地测试等效行为

c++ - 编译器代码生成错误或内存损坏?

c++ - cpp 映射作为函数参数获取警告信息 "discards qualifiers"

makefile - 如何将 Clang 诊断保存到文件中?

c++ - Makefile,不知道如何制作目标