Вопрос
Поддержка у вас есть программа на языке Си, включенная в некоторые файлы, а какая-то из них состоит из некоторых других, так что следующим образом:
----------------------------------------
File | Included files
----------------------------------------
main.c | stdio.h, table.h
----------------------------------------
list.c | list.h
----------------------------------------
symbol.c | symbol.h
----------------------------------------
table.c | table.h
----------------------------------------
table.h | symbol.h, list.h
----------------------------------------
пожалуйста, помогите мне создать makefile, большое вам спасибо!Это мой Makefile, но есть проблема?кто может отладить эти проблемы, спасибо!
hello: main.o table.o
gcc main.o table.o -o hello
main.o: main.c table.h
gcc -c main.c
table.o: table.c table.h
gcc -c table.c
symbol.o: symbol.c symbol.h
gcc -c symbol.c
list.o: list.c list.h
gcc -c list.c
clean:
rm hello *.o
Решение
Вот начало, не совсем так, как это сделал бы профессионал, но хорошо для начального уровня:
hello: main.o list.o symbol.o table.o
gcc -o hello main.o list.o symbol.o table.o
main.o: main.c table.h symbol.h list.h
gcc -c -o main.o main.c
list.o: list.c list.h
gcc -c -o list.o list.c
symbol.o: symbol.c symbol.h
gcc -c -o symbol.o symbol.c
table.o: table.c table.h symbol.h list.h
gcc -c -o table.o table.c
clean:
rm hello *.o
Конкретная проблема с вашим данным makefile заключается в том, что вы не связываете все объектные файлы.Потому что main.c
включает в себя table.h
и table.h
включает в себя symbol.h
и list.h
, вашей программе почти наверняка потребуется связать symbol.o
и list.o
также хорошо.
Также рекомендуется следовать зависимостям заголовков (например, main.o
зависит от table.h
и symbol.h/list.h
потому что table.h
зависит от этих двух) - это потому, что нет "аккуратного" способа получить промежуточный файл для зависимостей заголовков.
И вы редко помещаете стандартные заголовки в файлы make просто потому, что они не должны изменяться - если они изменятся (новый компилятор), просто очистите и создайте новые.