2017-02-17 9 views
0

Я новичок в gcc в Ubuntu, поэтому я пытаюсь создать Makefile. Моя папка проекта называется «проектом» внутри этой папки. У меня есть еще три папки: источники, заголовки, объекты (пустые).Makefile с файлами в разных каталогах

My Makefile должен иметь возможность создавать объектные файлы в папке «объекты». Однако я хочу, чтобы исполняемый файл и Makefile в основной папке: «project», затем я могу очистить исполняемый файл и файлы объектов. Как скомпилировать программу, включая эти папки? Это мой Makefile в качестве примера. Папка «project» находится в моей домашней папке.

CFLAGS= -ansi -pedantic -Wall -c 
all: project 

project: ./objects/main.o ./objects/factorial.o ./objects/gcd.o ./objects/greatestNumber.o ./objects/primeNumbers.o 
    gcc -o project ./objects/main.o ./objects/factorial.o ./objects/gcd.o ./objects/greatestNumber.o ./objects/primeNumbers.o 

main.o: ./sources/main.c 
    gcc $(CFLAGS) ./sources/main.c 

factorial.o: ./sources/factorial.c ./headers/factorial.h 
    gcc $(CFLAGS) ./sources/factorial.c 

gcd.o: ./sources/gcd.c ./headers/gcd.h 
    gcc $(CFLAGS) ./sources/gcd.c 

greatestNumber.o: ./sources/greatestNumber.c ./headers/greatestNumber.h 
    gcc $(CFLAGS) ./sources/greatestNumber.c 

primeNumbers.o: ./sources/primeNumbers.c ./headers/primeNumbers.h 
    gcc $(CFLAGS) ./sources/primeNumbers.c 

clean: 
    rm -f ./objects/main.o ./objects/factorial.o ./objects/gcd.o ./objects/greatestNumber.o ./objects/primeNumbers.o project 

Благодаря

+0

Вы уверены, что 'main.o' не зависит от каких-либо заголовков? – aschepler

+0

это зависит от gcd.h, factorial.h, greatNumber.h, primeNumbers.h – user3654532

ответ

5

Вы должны дать путь к цели объекта так же, как вы делаете для всех остальных имен файлов.

./objects/main.o: ./sources/main.c 
    gcc $(CFLAGS) ./sources/main.c 

... и так далее.

+1

Вы также должны использовать опцию '-o' для компилятора, чтобы сообщить ему, чтобы он выводил файл объекта там, где вы хотите. Проще всего использовать '-o $ @' и использовать автоматическую переменную make для цели. – MadScientist