Возможно, неправильный make-файл, неопределенная ссылка на функцию в C - PullRequest
0 голосов
/ 10 мая 2018

Попытка скомпилировать мою программу, которая имеет три исходных файла с именами hencode.c, hdecode.c и htable.c. Файл htable.c содержит все функции, которые используются в первых двух файлах, а файл htable.h содержит прототипы. Это мой Makefile, но я продолжаю получать ошибку undefined reference to 'function' на терминале.

Ни один из файлов не компилируется правильно. Я использую эту команду для компиляции файла: gcc -o hdecode -Wall -ansi -pedantic hdecode.c

Понятия не имею, что не так. Я включил "htable.h" во все мои файлы. Я думаю, что ошибка может быть в Makefile, но я не могу ее обнаружить. Спасибо за любую помощь.

Вот мой Makefile:

CC      = gcc
CFLAGS = -Wall -ansi -pedantic -g -std=c99
LD      = gcc

all: hdecode hencode

hdecode: htable.o hdecode.o
    $(LD) $(LDFLAGS) htable.o hdecode.o -o hdecode

hencode: htable.o hencode.o
    $(LD) $(LDFLAGS) htable.o hencode.o -o hencode

hdecode.o: hdecode.c
    $(CC) $(CFLAGS) -c hdecode.c

hencode.o: hencode.c
    $(CC) $(CFLAGS) -c hencode.c

htable.o: htable.c
    $(CC) $(CFLAGS) -c htable.c

clean:
    @rm *.o hdecode hencode

1 Ответ

0 голосов
/ 10 мая 2018

Попытка скомпилировать мою программу, которая имеет два исходных файла с именами hencode.c и hdecode.c. Файл htable.c содержит все функции, которые оба файла используют, а файл htable.h содержит прототипы.

Обратите внимание, что ваша программа состоит из трех исходных файлов, а не двух. При связывании финальной программы вам необходимо иметь символы, определенные в htable.c. Другими словами, #include -ing-файл не компилируется автоматически и не связывает его в конечной программе.

Мой hencode файл компилируется правильно, однако мой hdecode файл - нет. Я использую эту команду для компиляции файла: gcc -o hdecode -Wall -ansi -pedantic hdecode.c

Это неясно - вы используете Makefile или компилируете вручную? Если это последнее, вам нужно передать оба исходных файла (или объектные файлы, если они были скомпилированы ранее):

# Note the added htable.c
gcc -o hdecode -Wall -ansi -pedantic htable.c hdecode.c

Наконец, также обратите внимание, что Makefile можно упростить:

CC      = gcc
CFLAGS = -Wall -ansi -pedantic -g -std=c99

all: hdecode hencode

hdecode: htable.o hdecode.o
hencode: htable.o hencode.o
hdecode.o: hdecode.c
hencode.o: hencode.c
htable.o: htable.c

clean:
    @rm *.o hdecode hencode
...