Задать вопрос

Как с помощью make собрать исполняемый файл из 2-x исходников?

В общем два файла с исходным кодом main_0.c main_1.c и третий файл заголовочник header.h в коором все прототипы и глобальные переменные.
Вот текст makefile:
/home/tr/tr: /home/tr/main_0.o /home/tr/main_1.o
        cc  -o /home/tr/main_0.o /home/tr/main_1.o
/home/tr/main_0.o: /home/tr/main_0.c /home/tr/header.h               
        cc -c /home/tr/main_0.c                  
/home/tr/main_1.o: /home/tr/main_1.c /home/tr/header.h
        cc -c /home/tr/main_1.c

При вызове "make -f makefile" появляется такой вывод:
make -f /home/tr/tr_make
cc -c /home/tr/main_0.c
cc -o /home/tr/main_0.o /home/tr/main_1.o
/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
/home/tr/tr_make:2: ошибка выполнения рецепта для цели «/home/tr/tr»
make: *** [/home/tr/tr] Ошибка 1

Что делаю не так? если просто компилирую исходники, введя в терминале "gcc ...." все прекрасно компилируется и запускается. Уже много времени убил на сценарий мейкфайл да и последовательная сборка из двух объектных файлов это не вершина славы))Что не так то? Подсказывайте, прошу!
  • Вопрос задан
  • 228 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@Alexander1705
Как вам уже ответили в комментарии, вы просто не указали параметр для -o.
cc -o tr main_0.o main_1.o

Вообще, никогда не нужно использовать абсолютные пути в Makefile.
И ещё, если вы поменяете свой header.h, то make об этом не узнает.
У компиляторов есть специальные опции, чтобы сгенерировать зависимости .c файлов от заголовков.
Вот вам универсальный Makefile для простых проектов:
PROJECT = tr
SOURCES = main_0.c main_1.c
OBJECTS = $(SOURCES:.c=.o)
HEADER_DEPS = $(SOURCES:.c=.d)

.PHONY: all

all: $(PROJECT)

$(PROJECT): $(OBJECTS)
	$(CC) $(CFLAGS) $^ -o $@

-include $(HEADER_DEPS)

%.o: %.c
	$(CC) $(CFLAGS) -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $<
	$(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean

clean:
	$(RM) $(PROJECT) $(OBJECTS) $(HEADER_DEPS)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы