компилятор выдает ошибку с файлом make - PullRequest
0 голосов
/ 24 ноября 2018

После определенной попытки написать простую программу с основной и одной функцией, я прошу вашей помощи, чтобы найти ошибку.Я включил 3 файла, которые находятся в действии:

  • основная функция в base.c
  • функция в fun.c
  • makefile

Компилятор говорит, что функция неправильно вызывается в основном:

undefined reference to `fun'

base.c

#include <stdio.h>

int fun(char c);

main()
{
    printf("please enter a single char\n");
    char c=getchar();

    fun(c);

    return 0;
}

fun.c

#include <stdio.h>

int fun(char c)
{
    printf("%d3 is the value of your char!\n", 'c');
    return 0;
}

makefile

charprint:  base.o fun.o    
    gcc -g -Wall -ansi base.o fun.o -o charprint

base.o:   base.c
     gcc -g -Wall -ansi base.c -o base.o

fun.o:  fun.c
    gcc -g -Wall -ansi fun.c -o fun.o

1 Ответ

0 голосов
/ 24 ноября 2018

Проблема компиляции в том, что вы забыли флаги -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 выведет эту зависимость автоматически.Но вам нужно указать зависимость заголовочного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...