2016-09-21 8 views
0

Вот мой Makefile:Почему я получаю сообщение об ошибке «неопределенная ссылка на` pow »collect2: error: ld return 1 exit status make: *** [p1] Ошибка 1"?

CC=gcc 

CFLAGS=-g 

LDFLAGS=-lm 

EXECS= p1 


all: $(EXECS) 

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

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

+0

И makefile будет создавать исполняемый файл 'p1' из каких объектных файлов? И, пожалуйста, опубликуйте вывод из команды 'make' (после' make clean'). –

+0

Вы используете функцию pow в своем коде? – Angen

+0

Да, я использовал pow в своем коде. –

ответ

2

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

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

gcc p1.c -o p1 -lm 

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

Попробуйте вместо этого что-то вроде этого Makefile:

# 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 с использованием вышеуказанного Makefile, программа make должен сначала построить объектный файл p1.o из исходного файла p1.c. Затем следует использовать объектный файл p1.o, чтобы связать исполняемый файл p1 вместе со стандартной математической библиотекой.

+0

Да! Это сработало! Большое спасибо. Я не могу вас поблагодарить. –

+1

@BryceMarshall Вы можете поблагодарить ответчика более эффективно, выбирая и принимая его ответ :-) – njuffa

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

  • Нет связанных вопросов^_^