2

Возникла необходимость написать на С++ небольшую программу (500-1К строк), а с IDE я как-то не дружу (программируя на python и java обхожусь sublime'ом), да и хотелось узнать, как компилировать программы из консоли. Поэтому я написал "классовый" HelloWorld и начал читать этот мануал. Проблемы возникли при написании универсального makefile'a.

"Захардкоженный" makefile выглядит так (всё лежит в одной папке):

all: Greetings

Greetings: main_greetings.o greetings_printer.o
    g++ -o Greetings main_greetings.o greetings_printer.o

greetings_printer.o: GreetingsPrinter.cpp
    g++ -c -o greetings_printer.o GreetingsPrinter.cpp

main_greetings.o: Greetings.cpp
    g++ -c -o main_greetings.o Greetings.cpp

и команда

make -f makefile.makefile

делает всё, что нужно: программа компилируется и работает.

Но вот попытка написать универсальный makefile оборачивается провалом. Сам makefile:

TARGET  = $( shell basename 'pwd' )
SOURCES = $( wildcard *.cpp ) 
OBJECTS = $( SOURCES:%.cpp=%.o )

all: $(TAGRET)

$(OBJECTS): $(SOURCES)

$(TAGRET): $(OBJECTS)
    $(CXX) -o $(TAGRET) $(LDFLAGS) $(OGJECTS) $(LOADLIBES) $(LDLIBS)

clean:
    $(RM) $(OBJECTS) $(TAGRET)

.PHONY: all clean

а предыдущий вызов из консоли выдаёт такой результат:

make: Nothing to be done for `all'.

В чём ошибка?


Попробовал вот так:

make Greetings

Вывод:

g++     Greetings.cpp   -o Greetings
/tmp/ccGdTOxR.o: In function `main':
Greetings.cpp:(.text+0x1d): undefined reference to `MyGreetingsPrinter::MyGreetingsPrinter()'
Greetings.cpp:(.text+0x29): undefined reference to `MyGreetingsPrinter::PrintGreetings()'
collect2: ld returned 1 exit status
make: *** [Greetings] Error 1

Хотя с первой версией makefile программа работала без ошибок.

9
  • а в строке TARGET = $( shell basename 'pwd' ) кавычки точно правильные? как по мне, так там нужны обратные кавычки.
    – KoVadim
    22 июл 2014 в 13:36
  • @KoVadim Поменял. Результат тот же.
    – Montreal
    22 июл 2014 в 13:38
  • с прямыми кавычками у Вас TARGET всегда будет pwd. попробуйте запустить так make -d all и попытаться разобраться, что пошло не так
    – KoVadim
    22 июл 2014 в 13:50
  • @KoVadim После этой команды идёт очень-очень большой вывод, если будет необходимо -- скину весь. Вся соль, наверное, в этой строке: Considering target file makefile'.`
    – Montreal
    22 июл 2014 в 13:56
  • 1
    первое - а make clean отрабатывает? второе - а после clean работает all правильно? не изменяйте вопрос. Коментарии не бесконечны. Поменялся вопрос - этот закрыли, открыли новый. А то даже не понятно, о чем все коментарии.
    – KoVadim
    22 июл 2014 в 15:40

3 ответа 3

1

судя по всему, в этой строке опечатка (не те кавычки):

TARGET  = $( shell basename 'pwd' )

вероятно, должно быть так:

TARGET  = $( shell basename `pwd` )

тогда в переменную TARGET будет записано имя текущего каталога, а не строка pwd.

make: Nothing to be done for `all'.
В чём ошибка?

никакой ошибки нет. просто программе make нечего делать. что бы ни было записано в TARGET (pwd или имя текущего каталога), вероятно, файл или каталог с таким именем уже имеется в текущем каталоге, и время его последнего обновления больше (т.е., он «моложе»), чем у любого из файлов с суффиксом .o.

1

При вызове функций make недопустимы пробелы между $( и именем функции. Пробел перед закрывающей скобкой также не нужен, ибо он будет записан в переменную. Уберите лишние пробелы и конечно используйте обратные кавычки:

TARGET  = $(shell basename `pwd`)

Но всё уже есть в самом make, поэтому проще будет так:

TARGET  = $(notdir $(PWD))

Зависимости *.o от *.cpp make отслеживает автоматически. Как вызывать компилятор он тоже знает, ему только нужно сообщить какие подключать библиотеки:

LDLIBS=-lm

где их искать:

LDFLAGS=-L../mylibs

и флаги для g++:

CXXFLAGS=-O3

т.е. ваша строка с $(CXX) и т.д. не нужна.

Подробнее о переменных make

0

В этой строке

    $(CXX) -o $(TAGRET) $(LDFLAGS) $(OGJECTS) $(LOADLIBES) $(LDLIBS)

похоже, опечатка: OGJECTS вместо OBJECTS

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.