Makefile не создает исполняемый файл - PullRequest
0 голосов
/ 16 марта 2019

Таким образом, я искал переполнение стека и остальную часть Интернета, и хотя я нашел похожие вопросы, я не нашел ни одного, в котором ответ работает для моей проблемы.Я только учусь создавать make-файлы и буду признателен за любую помощь.Сначала я создал make-файл с переменной «objects», когда набрал make, он скомпилирует файлы .c, создающие файлы .o, однако исполняемый файл не был создан.Вот как выглядел мой make-файл:

objects = user_interface.o interacts.o linked_list_funcs.o

proj4ex: $(objects)
<tab> cc -o proj4ex $(objects)
user_interface.o: user_interface.c header.h
<tab> cc -c user_interface.c
interacts.o: interacts.c header.h
<tab> cc -c interacts.c
linked_list_funcs.o: linked_list_funcs.c header.h
<tab> cc -c linked_list_funcs.c
clean:
<tab> rm proj4ex $(objects)

Затем я попытался изменить свой make-файл на точно такой же, но с именами файлов вместо переменной «objects».При использовании make с этой новой формой моего make-файла, он, кажется, компилируется, но я получаю ошибки о своем коде.Я не уверен, что неправильно понимаю ошибку, но считаю, что это будет означать, что моя переменная "debugMode" была объявлена ​​несколько раз, чего не было.Это то, что я получаю, когда использую make-файл с именами файлов в списке

enter image description here

Мне интересно, если мой оригинальный make-файл неправильно читал другие файлы?Просто очень запутался здесь и был бы признателен за любую помощь, спасибо!

1 Ответ

0 голосов
/ 16 марта 2019

Как сказал Джозеф, компилятор говорит вам, что вы определили идентификатор 'debugMode' несколько раз. Вы можете сказать, потому что он ссылается на раздел .bss, который имеет отношение к двоичному файлу, а не к make. Кроме того, компоновщик ld явно является причиной сбоя на этом этапе, что имеет смысл, поскольку является ошибкой компоновщика.

При этом я бы сделал следующие рекомендации для вашего make-файла. Внутренне, Make уже знает, как скомпилировать c-файлы, и выглядит это так:

%.o: %.c
    $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $^

Этот рецепт создаст все необходимые объектные файлы из файлов c, но, опять же, Make уже знает это. Если вы собираетесь написать рецепт полностью, это должно быть потому, что вы добавляете дополнительные вещи, необходимые для проекта. Вы хотите указать компилятор как $ (CC), чтобы когда ваши пользователи компилировали проект, они могли указать свой компилятор по своему выбору, например: make CC=icc или любой другой.

Чтобы подчеркнуть главное, проблема в вашем коде, а не в make-файле.

...