Makefile не оценивает переменную OBJECTS - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь создать Makefile, который будет создавать общую библиотеку с g ++, и я обнаружил, что он не оценивает переменную OBJECTS.Это на Ubuntu 18.04, и все файлы находятся в одном текущем каталоге.Во-вторых, он полностью пропускает компиляцию исходного файла и переходит непосредственно к оценке инструкции компоновки.В качестве пояснения я использую GNU Make 4.1

Вот что я получаю, когда набираю make all

g++  -shared -pthread   -o   tree.so
g++: fatal error: no input files
 compilation terminated.
Makefile:12: recipe for target 'tree.so' failed
make: *** [tree.so] Error 1

Вот мой код Makefile

CC=g++
CFLAGS = -I/usr/local/include -Wall -std=c++17 -O3   -march=native -Ofast -ftree-vectorize
LIBS=-shared -pthread 
SOURCES=$(wildcard *.cpp)
OBJECTS=$(wildcard *.o)
TARGET=tree.so


all:$(TARGET)

$(TARGET) : $(OBJECTS)
        $(CC)  $(LIBS)  -o $(OBJECTS)  $(TARGET)

$(OBJECTS):$(SOURCES)
        $(CC)  -c -g $(CFLAGS) $(SOURCES)

clean:
       rm -f $(OBJECTS) $(TARGET)

1 Ответ

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

Если у вас есть только файлы *.cpp в ваших каталогах, тогда еще нет никаких *.o, поэтому ваш $(wildcard *.o) расширится до нуля.

То, что вы хотите - это получить *.cpp файлов и вычислите соответствующие *.o файлы:

OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))

или эквивалентно:

OBJECTS=$(SOURCES:.cpp=.o)

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

$(OBJECTS): %.o: %.cpp
         $(CC) -c -g $(CFLAGS) $< -o $@

, чтобы на самом деле перестраивались только файлы, к которым вы прикасались.

Также у вас неверная команда компоновки.Это должно быть:

$(TARGET) : $(OBJECTS)
        $(CC)  $(LIBS)  -o $(TARGET) $(OBJECTS)

, поскольку аргументом опции -o является файл output , то есть цель.

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