2015-09-25 8 views
-1

Я пытаюсь установить PintOS на свою локальную машину Ubuntu 14.04. Когда я пытаюсь запустить make для компиляции утилит. Я получаю следующую ошибку.Как мне изменить свой файл makefile, чтобы избежать неопределенной ссылки на функцию в библиотеке maths?

[email protected]:~/os/pintos/src/utils$ ls 
backtrace Makefile pintos pintos.~1.55.~ pintos-mkdisk    setitimer-helper.o squish-unix.c 
CVS  Makefile~ pintos~ pintos-gdb  setitimer-helper.c   squish-pty.c 
[email protected]:~/os/pintos/src/utils$ make 
gcc -lm setitimer-helper.o -o setitimer-helper 
setitimer-helper.o: In function `main': 
setitimer-helper.c:(.text+0xbe): undefined reference to `floor' 
collect2: error: ld returned 1 exit status 
make: *** [setitimer-helper] Error 1 
[email protected]:~/os/pintos/src/utils$ 

математик библиотека (для <math.h> заголовка, который используется в setitimer-helper.c) не получает связан должным образом. Когда я заглядываю в Makefile, это результат.

[email protected]:~/os/pintos/src/utils$ cat Makefile 
all: setitimer-helper squish-pty squish-unix 

CC = gcc 
CFLAGS = -Wall -W 
LDFLAGS = -lm 
setitimer-helper: setitimer-helper.o 
squish-pty: squish-pty.o 
squish-unix: squish-unix.o 

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix 

Скажите, пожалуйста, как исправить это. Кстати, я использую gcc-4.8.6.

+0

Существует ряд вопросов, которые являются дубликатом. Проблема заключается в перечислении библиотек перед объектными файлами - ответ «нет». –

+0

Но вопрос в том, как вы это делаете, изменяя Makefile. – Ankit

+0

OK; тогда должно быть редактирование вопроса ... Примерно по тому, что я только что сделал. Вы можете решить, хотите ли вы, чтобы ваша математическая библиотека была единственной или множественной. Кроме того, не забудьте сообщить об ошибке разработчикам Pintos; существует так много платформ, где make-файл не будет работать, как там, где он работает (или он работает случайно - многие версии 'make' put' $ {LDFLAGS} 'и' $ {LDLIBS} 'после объектных файлов на линии связи, которая бы сработала). Другие не видят вашей проблемы. –

ответ

1
gcc -lm setitimer-helper.o -o setitimer-helper 

Проблема в порядке ваших аргументов GCC. Попробуйте это:

gcc -o setitimer-helper setitimer-helper.o -lm 

Это из-за способа, что ld решает неопределенные символы при компоновке. В основном, как вы это делали раньше, ld сначала видит -lm и говорит: «У меня нет причин включать эту библиотеку». Затем он включает ваш setitimer-helper.o, который имеет неразрешенную ссылку на floor. После этого больше нет библиотек, и floor остается неразрешенным.

Если -lm приходит после этого, он может разрешить ссылку на floor.

+0

Какие изменения мне нужно сделать в Makefile для этого? – Ankit

+1

Смена LDFLAGS на LDLIBS в Makefile. Теперь он запускает gcc setitimer-helper.o -lm -o setitimer-helper – Ankit

+0

Отлично. Рад, что смог помочь. Пожалуйста, не забудьте проголосовать за любой ответ, который помог, и принять ответ, если он решает вашу проблему. –