Почему makefile не распознает определенную библиотеку в C? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть программа на C, которая скомпилирована с g cc из Makefile. Код make-файла:

CC=gcc
CFLAGS=-c -g -Wall -std=gnu99
LDFLAGS=#-pthread

SOURCES=ficheros_basico.c bloques.c mi_mkfs.c leer_SF.c #todos los .c
LIBRARIES=ficheros_basico.o bloques.o #todos los .o de la biblioteca del SF
INCLUDES=ficheros_basico.h bloques.h #todos los .h
PROGRAMS=mi_mkfs leer_SF
OBJS=$(SOURCES:.c=.o)

all: $(OBJS) $(PROGRAMS)

    $(PROGRAMS): $(LIBRARIES) $(INCLUDES)
    $(CC) $(LDFLAGS) $(LIBRARIES) $@.o -o $@

%.o: %.c $(INCLUDES)
    $(CC) $(CFLAGS) -o $@ -c $<

.PHONY: clean
clean:
    rm -rf *.o *~ $(PROGRAMS)

Затем я получаю вывод:

gcc   mi_mkfs.o   -o mi_mkfs
/usr/bin/ld: mi_mkfs.o: en la función `main':
/home/ehe781/SOII_FS/mi_mkfs.c:9: referencia a `bmount' sin definir
/usr/bin/ld: /home/ehe781/SOII_FS/mi_mkfs.c:12: referencia a `bwrite' sin definir
/usr/bin/ld: /home/ehe781/SOII_FS/mi_mkfs.c:14: referencia a `initSB' sin definir
/usr/bin/ld: /home/ehe781/SOII_FS/mi_mkfs.c:15: referencia a `initMB' sin definir
/usr/bin/ld: /home/ehe781/SOII_FS/mi_mkfs.c:16: referencia a `initAI' sin definir
/usr/bin/ld: /home/ehe781/SOII_FS/mi_mkfs.c:17: referencia a `bumount' sin definir
collect2: error: ld returned 1 exit status
make: *** [<integrado>: mi_mkfs] Error 1

, когда я запускаю make-файл. Я определил эти функции в bloques.h и включил это в ficheros_basico.h. Наконец, я включил его в mi_mkfs.c, так что, как я вижу, если вы go внутри ficheros_basico.h, вы обнаружите включение bloques.h, которое имеет определенные функции. Почему make-файл не распознает ссылки на функции?

PD: Извините за возможно грязный вопрос, но я не знал, как объяснить это по-другому.

1 Ответ

0 голосов
/ 04 марта 2020

Это вызвано неверным отступом вместе со встроенным правилом. Строка с отступом $(PROGRAMS) не определяет цель, а скорее интерпретируется как часть рецепта для all. Ваш mi_mkfs файл фактически генерируется неявным правилом, которое можно проверить с помощью make -p:

mi_mkfs: mi_mkfs.o
#  Implicit rule search has been done.
#  Implicit/static pattern stem: 'mi_mkfs'
#  Modification time never checked.
#  File has been updated.
#  Failed to be updated.
# automatic
# @ := mi_mkfs
# automatic
# % :=
# automatic
# * := mi_mkfs
# automatic
# + := mi_mkfs.o
# automatic
# | :=
# automatic
# < := mi_mkfs.o
# automatic
# ^ := mi_mkfs.o
# automatic
# ? := mi_mkfs.o
# variable set hash-table stats:
# Load=8/32=25%, Rehash=0, Collisions=1/19=5%
#  recipe to execute (built-in):
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

Чтобы заставить его работать, сделайте отступ в строке $(PROGRAMS) правильно:

$(PROGRAMS): $(LIBRARIES) $(INCLUDES)
        $(CC) $(LDFLAGS) $(LIBRARIES) $@.o -o $@

Теперь вывод отличается:

$ make
gcc  ficheros_basico.o bloques.o  mi_mkfs.o -o mi_mkfs

, так как теперь вызывается ваше пользовательское правило связывания:

$ make -p
...
mi_mkfs: ficheros_basico.o bloques.o ficheros_basico.h bloques.h
#  Implicit rule search has not been done.
#  Implicit/static pattern stem: ''
#  Modification time never checked.
#  File has been updated.
#  Failed to be updated.
# automatic
# @ := mi_mkfs
# automatic
# % :=
# automatic
# * :=
# automatic
# + := ficheros_basico.o bloques.o ficheros_basico.h bloques.h
# automatic
# | :=
# automatic
# < := ficheros_basico.o
# automatic
# ^ := ficheros_basico.o bloques.o ficheros_basico.h bloques.h
# automatic
# ? := ficheros_basico.o bloques.o ficheros_basico.h bloques.h
# variable set hash-table stats:
# Load=8/32=25%, Rehash=0, Collisions=1/16=6%
#  recipe to execute (from 'Makefile', line 14):
        $(CC) $(LDFLAGS) $(LIBRARIES) $@.o -o $@
...