Проблема компиляции в том, что вы забыли флаги -c
в строке компилятора для base.o
и fun.o
.Один очевидный простой (но не очень хороший) способ исправить это:
charprint: base.o fun.o
gcc -g -Wall -ansi base.o fun.o -o charprint
base.o: base.c
gcc -c -g -Wall -ansi base.c -o base.o
fun.o: fun.c
gcc -c -g -Wall -ansi fun.c -o fun.o
Интересно, что самым простым решением было бы удаление двух команд компилятора для двух объектных файлов - make знает, как компилировать файлы Cк объектным файлам.Вы можете установить CFLAGS + = -Wall (или CFLAGS = -Wall), чтобы включить (очень важный) флаг -Wall.Добавление -Werror
тоже было бы хорошо.
CFLAGS += -Wall -Werror -g -std=c11
charprint: base.o fun.o
${CC} ${CFLAGS} base.o fun.o -o $@
base.o: base.c
fun.o: fun.c
В коде для fun()
ваш аргумент для printf()
должен быть просто c
, а не 'c'
.Вы, вероятно, также имеете в виду %3d
, а не %d3
, хотя это «работает»;это просто не делает то, что вы ожидаете.Обратите внимание, что вы должны использовать явный int main(void) { … }
.И вам, вероятно, следует создать заголовок fun.h
, содержащий:
extern int fun(char c);
и #include "fun.h"
в обоих исходных файлах, и добавить fun.h
после имени исходного файла в строках зависимости в make-файле:
CFLAGS += -Wall -Werror -g -std=c11
charprint: base.o fun.o
${CC} ${CFLAGS} base.o fun.o -o $@
base.o: base.c fun.h
fun.o: fun.c fun.h
На самом деле вам не нужно указывать исходные файлы как зависимости для объектных файлов;make
выведет эту зависимость автоматически.Но вам нужно указать зависимость заголовочного файла.