2016-09-13 4 views
0

Поэтому у меня есть три файла:Makefile (с суффиксами) в C

log.c : defines all the functions 
log.h : lists all the functions 
main.c. : uses the functions 

Теперь, как log.c и main.c имеют заголовки log.h.

gcc log.c main.c 

Вышеуказанные работает отлично, никаких ошибок. Однако, когда я пытаюсь сделать Makefile следующее this учебник, у меня есть:

CC=gcc 
CFLAGS=-I 

log: main.o log.o 
    $(CC) -o log main.o log.o -I 

Когда я бегу make, это показывает ошибку каждый раз, когда main называется функция, определенная в log.c, говоря «неопределенная ссылка на (функция) ».

Любая помощь с этим была бы оценена.

-bash-4.2$ make 
gcc -I -c -o main.o main.c 
/tmp/ccQOC7wH.o: In function `main': 
main.c:(.text+0x11): undefined reference to `getlog' 
main.c:(.text+0x6f): undefined reference to `buildmsg' 
main.c:(.text+0x7b): undefined reference to `savelog' 
main.c:(.text+0x109): undefined reference to `buildmsg' 
main.c:(.text+0x19a): undefined reference to `buildmsg' 
main.c:(.text+0x207): undefined reference to `getlog' 
main.c:(.text+0x223): undefined reference to `savelog' 
main.c:(.text+0x247): undefined reference to `buildmsg' 
main.c:(.text+0x24c): undefined reference to `getlog' 
main.c:(.text+0x268): undefined reference to `savelog' 
main.c:(.text+0x279): undefined reference to `clearlog' 
collect2: error: ld returned 1 exit status 
+1

Пожалуйста, сообщите точную ошибку. Вышеупомянутая команда правила либо не работает, либо дает ошибку, которую вы не показываете. Поскольку для параметра '-I' требуется значение, а' gcc' не будет работать успешно, как показано. – kaylum

+0

Прочтите внимательно. Фактическая команда в учебнике имеет '.' после опции' -I': '-I.' – kaylum

+0

Я включил полное сообщение об ошибке и -I. не имеет значения –

ответ

0

Когда вы запускали свой Makefile, который имел -I вместо -I., вы создали недопустимую main.o. Вам нужно вернуть -I. в CFLAGS и rm *.o из этого каталога. Тогда это должно сделать хорошо.

3

Вы не указали включаемый каталог для опции I, поэтому во время стадии компиляции GCC фактически интерпретирует -c как каталог включает, который отменяет флаг компиляции только, а затем пытается связать свою программу.

Вам не нужен включаемый флаг, вам даже не нужен рецепт для связи, потому что ваш файл макет соответствует правилам предопределённых, всему Makefile (предполагая, что cc найти ссылку на свой компилятор по умолчанию) может быть просто

log: log.o main.o 
+0

Интересно: для классических версий 'make' потребуется команда связывания, но GNU Make не делает (несколько до удивления). Вы также должны включать: 'main.o log.o: log.h', теоретически, но ваш минимальный файл выполняет свою работу. Существуют определенные ограничения на этот механизм, но в контексте он работает. –

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