Makefiles и вложенные заголовки - PullRequest
0 голосов
/ 23 мая 2019

Моя проблема с получением make-файла для запуска. Я новичок в этом, обычно я просто компилирую из терминала или использую свою IDE.

Так что моя проблема, вероятно, связана с зависимостями вложенных заголовков. У меня есть файлы, которые включают файлы заголовков, которые имеют файлы заголовков, которые имеют файлы заголовков. И все эти заголовочные файлы имеют файл .cpp.

Так что я гуглил интернет, чтобы найти ветку, в которой говорилось, что если у вас есть заголовочные файлы, которые включают заголовочные файлы. Вы должны добавить это к предпосылкам, и что нет никакого способа обойти это.

Основные зависимости Makefile и заголовка

Так что я попробовал это, но мой случай немного отличался, потому что у моих вложенных заголовков также были файлы .cpp. Поэтому я попытался добавить те к месту рецепта, которые не сработали. Поэтому я попытался добавить файлы .cpp, которые были необходимы, в необходимое место. Это тоже не сработало.

  1 OBJECTS = main.o MovementHandle.o Cursor.o PromptHandle.o \
  2           Prompt.o NcursesOptions.o RT_Error.o Video.o Frame.o RGB.o
  3 
  4 CXXFLAGS = -std=c++17 -c
  5 LIBS = -lncurses
  6 
  7 drawterm : $(OBJECTS)
  8         g++ -o $(OBJECTS) $(LIBS)
  9 
 10 main.o : main.cpp MovementHandle.o PromptHandle.o
 11         g++ $(CXXFLAGS) main.cpp
 12 
 13 MovementHandle.o : MovementHandle.cpp MovementHandle.h Cursor.o
 14         g++ $(CXXFLAGS) MovementHandle.cpp
 15 
 16 Cursor.o : Cursor.cpp Cursor.h
 17         g++ $(CXXFLAGS) Cursor.cpp
 18 
 19 PromptHandle.o : PromptHandle.cpp PromptHandle.h Prompt.o Video.o
 20         g++ $(CXXFLAGS) PromptHandle.cpp
 21 
 22 Prompt.o : Prompt.cpp Prompt.h Cursor.o NcursesOptions.o
 23         g++ $(CXXFLAGS) Prompt.cpp
 24 
 25 NcursesOptions.o : NcursesOptions.cpp NcursesOptions.h RT_Error.o
 26         g++ $(CXXFLAGS) NcursesOptions.cpp
 27 
 28 RT_Error.o : RT_Error.cpp RT_Error.h
 29         g++ $(CXXFLAGS) RT_Error.cpp
 30 
 31 Video.o : Video.cpp Video.h Frame.o
 32         g++ $(CXXFLAGS) Video.cpp
 33 
 34 Frame.o : Frame.cpp Frame.h RGB.o
 35         g++ $(CXXFLAGS) Frame.cpp
 36 
 37 RGB.o : RGB.cpp RGB.h
 38         g++ $(CXXFLAGS) RGB.cpp

Так что я продолжал получать это, и я знаю, что это значит:

/usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../lib/Scrt1.o: in function `_start':
    (.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [makefile:8: drawterm] Error 1

Это означает, что make нашел файл, который я еще не скомпилировал должным образом, что означает, что make предполагает, что он имеет

int main()
{
    return 0;
}

В нем, но он не находит его, потому что он не предназначен для такой интерпретации.

1 Ответ

1 голос
/ 23 мая 2019

Я думаю, что это нижняя строка:

    g++ -o $(OBJECTS) $(LIBS)

Когда $(OBJECTS) развернуто, оно становится (вероятно, потому что вы не показали объявление переменной OBJECTS):

    g++ -o main.o MovementHandle.o Cursor.o ...
*Параметр 1007 *-o глотает main.o в качестве аргумента, поэтому эта команда в основном означает:

сборка программы main.o из объектов MovementHandle.o ...

Скорее всего, вам нужно изменить его на что-то вроде этого:

    g++ -o $@ $(OBJECTS)
    # $@ resolves to target, which in your case will be name of executable you want
...