Создание make-файла

#c #makefile

#c #makefile

Вопрос:

Как создать файл make для запуска, например, синтаксического анализатора xml со следующей командой командной строки

 gcc source.c -I/usr/include/libxml2 -lxml2 -o output
  

Я использую это для включения libxml при компиляции с использованием командной строки.

Как бы это было сделано с использованием файла make вместо использования командной строки?

Ответ №1:

 SOURCES:=source.c
OBJECTS:=$(SOURCES:%.c=%.o)
CC=gcc
CFLAGS=-g -Wall -I/usr/include/libxml2
LD=gcc
LDFLAGS=
LIBS=-lxml2
TARGET:=output



all: $(TARGET)

$(TARGET): $(OBJECTS)
        $(LD) -o $@ $(OBJECTS) $(LDFLAGS) $(LIBS)

.c.o:
        $(CC) $(CFLAGS) -c $< -o $@

depend:
        $(CC) $(CFLAGS) -MM $(SOURCES) > .depend

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

.depend: depend

include .depend
  

Вы можете использовать это как шаблон, затем добавлять / изменять исходные файлы, TARGET, CFLAGS, LDFLAGS и библиотеки. Для файлов Make требуются табуляции для отступов, поэтому вам нужно будет исправить пробелы, если вы скопируете и вставите это.

Комментарии:

1. Обратите внимание, что командные строки (строки $ (CC) и $(LD)) должны начинаться с символа табуляции, а не с пробелов.

2. @Helium3: Активирует большинство предупреждений компилятора — вам следует сделать это привычкой, это расскажет вам о множестве распространенных проблем.

3. Здесь простой вопрос. Что за файл является make-файлом? просто обычный файл .c?

4. Также. это 1 вкладка или две перед, например, $ (LD)?

5. @Helium3: makefile — это просто обычный текстовый файл. Строка, начинающаяся с табуляции, интерпретируется как команда; все, что находится после первой табуляции, передается командной оболочке (после замены переменной и исключения небольшого количества управляющих символов в начале команды, таких как @, -, ).

Ответ №2:

В самом простом виде:

 output: source.c
    gcc source.c -I/usr/include/libxml2 -lxml2 -o output
  

теперь вы можете произнести либо make output of make , либо получить output build.

Ответ №3:

Если вы позволите себе, чтобы выходной файл имел то же имя, что и исходный (без суффикса .c), вы можете просто сделать:

CPPFLAGS = -I/usr/include/libxml2
LDFLAGS = -lxml2

Используя только эти две строки в вашем makefile,

создать исходный код

будет выполнен поиск source.c и сгенерирован исполняемый файл с именем ‘source’ с соответствующими флагами.