gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:26:10 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com