Почему я получаю сообщение об ошибке undefined ссылка на `pow 'collect2: error: ld вернула 1 статус выхода make: *** [p1] Ошибка 1?

Вот мой make-файл:

CC=gcc 

CFLAGS=-g

LDFLAGS=-lm

EXECS= p1


all: $(EXECS)

clean: 
    rm -f *.o $(EXECS)

14:32:16 **** Сборка конфигурации по умолчанию для проекта CH3-Programs **** make p1 gcc -g -ggdb -lm p1.c -o p1 /tmp/ccNTyUSA.o: В функции main': /home/bm5788/fromVM/Workspace/CH3-Programs//p1.c:28: undefined reference topow 'collect2: ошибка: ld возвратил 1 статус выхода make: *** [p1] Ошибка 1: рецепт для цели 'p1' не выполнен


person Bryce Marshall    schedule 21.09.2016    source источник
comment
И make-файл будет строить исполняемый файл p1 из каких объектных файлов? И, пожалуйста, опубликуйте результат выполнения команды make (после make clean).   -  person Some programmer dude    schedule 21.09.2016
comment
Вы используете функцию pow в своем коде?   -  person Angen    schedule 21.09.2016
comment
Да, я использовал pow в своем коде.   -  person Bryce Marshall    schedule 21.09.2016
comment
Где мне найти объектные файлы?   -  person Bryce Marshall    schedule 21.09.2016
comment
Я имею в виду, вы говорите, что all зависят от $ (EXECS) `(т.е. p1). Но от чего $(EXECS) зависит?   -  person Some programmer dude    schedule 21.09.2016
comment
Не знаю, откуда мне знать. Я новичок во всем этом.   -  person Bryce Marshall    schedule 21.09.2016
comment
Мне сказали, что пока у меня есть -lm, он должен связывать math.h.   -  person Bryce Marshall    schedule 21.09.2016
comment
в какой папке у вас есть math.h и в какой папке у вас код   -  person Angen    schedule 21.09.2016
comment
Мой код находится в папке "CH3-Programs"   -  person Bryce Marshall    schedule 21.09.2016


Ответы (1)


Проблема здесь в порядке связывания с математической библиотекой (опция -lm). При сборке библиотеки должны располагаться после исходных или объектных файлов в командной строке.

Итак, если вы запустили команду для сборки вручную, она должна выглядеть так:

gcc p1.c -o p1 -lm

Проблема в том, что ваш make-файл на самом деле ничего не делает и живет только на неявных правилах. Неявные правила используют определенные переменные в определенном порядке, что не позволяет разместить библиотеку в нужном месте в вашем make-файле.

Попробуйте вместо этого что-нибудь вроде этого make-файла:

# The C compiler to use.
CC = gcc

# The C compiler flags to use.
# The -g flag is for adding debug information.
# The -Wall flag is to enable more warnings from the compiler
CFLAGS = -g -Wall

# The linker flags to use, none is okay.
LDFLAGS = 

# The libraries to link with.
LDLIBS = -lm

# Define the name of the executable you want to build.
EXEC = p1

# List the object files needed to create the executable above.
OBJECTS = p1.o

# Since this is the first rule, it's also the default rule to make
# when no target is specified. It depends only on the executable
# being built.
all: $(EXEC)

# This rule tells make that the executable being built depends on
# certain object files. This will link using $(LDFLAGS) and $(LDLIBS).
$(EXEC): $(OBJECTS)

# No rule needed for the object files. The implicit rules used
# make together with the variable defined above will make sure
# they are built with the expected flags.

# Target to clean up. Removes the executable and object files.
# This target is not really necessary but is common, and can be
# useful if special handling is needed or there are many targets
# to clean up.
clean:
    -rm -f *.o $(EXEC)

Если вы запустите make с использованием вышеуказанного make-файла, программа make должна сначала построить объектный файл p1.o из исходного файла p1.c. Затем следует использовать объектный файл p1.o для связывания исполняемого файла p1 со стандартной математической библиотекой.

person Some programmer dude    schedule 21.09.2016
comment
Да!! Это сработало! Большое тебе спасибо. Я не могу вас достаточно отблагодарить. - person Bryce Marshall; 21.09.2016
comment
@BryceMarshall Вы можете более эффективно поблагодарить ответчика, проголосовав за него и приняв его ответ :-) - person njuffa; 21.09.2016