Проблемы с правильным написанием моего c ++ Makefile - PullRequest
0 голосов
/ 19 января 2019
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 голосов
/ 19 января 2019

При отсутствии явного правила для 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)) в качестве входных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...