2017-02-21 6 views
2

У меня есть 3 файловКак создать и запустить файл make для C?

hellomain.c 
hellofunc.c 
helloheader.h 

и я бегу через компилятор GCC. Обычно меняю:

gcc helloheader.h hellomain.c hellofunc.c -o results 

И все будет работать.

Как это можно преобразовать в make-файл? Я знаю, что я должен назвать его makefile. Я знаю, что мне нужно позвонить, набрав в компиляторе make. Но не уверен, что на самом деле ввести в make-файл.

+2

Есть тысячи примеров и руководств по make-файлам. Начните с копирования одного из простых и оттуда. –

+0

Кроме того, вы не должны создавать файл заголовка. –

+0

Я пробовал следовать приведенным здесь примерам: https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html#zz-2.3 Но не смог заставить его работать. –

ответ

3

Просто о самом простом Makefile возможно для проекта, как ваше будет что-то вроде этого:

# The name of the source files 
SOURCES = hellomain.c hellofunc.c 

# The name of the executable 
EXE = results 

# Flags for compilation (adding warnings are always good) 
CFLAGS = -Wall 

# Flags for linking (none for the moment) 
LDFLAGS = 

# Libraries to link with (none for the moment) 
LIBS = 

# Use the GCC frontend program when linking 
LD = gcc 

# This creates a list of object files from the source files 
OBJECTS = $(SOURCES:%.c=%.o) 

# The first target, this will be the default target if none is specified 
# This target tells "make" to make the "all" target 
default: all 

# Having an "all" target is customary, so one could write "make all" 
# It depends on the executable program 
all: $(EXE) 

# This will link the executable from the object files 
$(EXE): $(OBJECTS) 
    $(LD) $(LDFLAGS) $(OBJECTS) -o $(EXE) $(LIBS) 

# This is a target that will compiler all needed source files into object files 
# We don't need to specify a command or any rules, "make" will handle it automatically 
%.o: %.c 

# Target to clean up after us 
clean: 
    -rm -f $(EXE)  # Remove the executable file 
    -rm -f $(OBJECTS) # Remove the object files 

# Finally we need to tell "make" what source and header file each object file depends on 
hellomain.o: hellomain.c helloheader.h 
hellofunc.o: hellofunc.c helloheader.h 

Это может быть еще проще, но при этом у вас есть некоторая гибкость.


Просто для полноты, это, вероятно, самый простой Makefile можно:

results: hellomain.c hellofunc.c helloheader.h 
    $(CC) hellomain.c hellofunc.c -o results 

Это в основном делает то, что вы уже делаете в командной строке. Он не очень гибкий, и он будет восстанавливать все, если какой-либо файл изменится.

+0

Итак, вставьте самую базовую версию, которую вы разместили здесь, чтобы протестировать ее в make-файле без какого-либо расширения. Но когда я набираю make и нажимаю enter, я получаю *** отсутствующий разделитель. Стоп. –

+0

@ DanielD Необходимо, чтобы пробелы перед командами были * вкладками *. Это не может быть, например, четыре пробела. Вы должны отредактировать файл, чтобы убедиться, что это вкладки. –

+0

ах правильно забыл об этом, помнив, что это тоже! спасибо, что это сработало, теперь я могу построить на этом :) –

-1

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

results: hellomain.o hellofunc.o 
    gcc $^ -o results 

hellomain.o: hellomain.c helloheader.h 
    gcc -c $< 

hellofunc.o: hellofunc.c helloheader.h 
    gcc -c $< 

Обязательно используйте символ табуляции для отступов в файле makefile.

+0

Это не хорошая демонстрация того, как писать Makefile. – duskwuff

+0

Почему это не хорошо? – anatolyg

 Смежные вопросы

  • Нет связанных вопросов^_^