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

value *= pow(10, 3); // this one compiles
value *= pow(10, aVar); // this one produces this error:
                         //Number.c:(.text+0x469): undefined reference to `pow'

aVar — переменная типа int.

Что бы это могло быть?

Я использую make-файл. Я выполняю "make lexanc". Мой make-файл выглядит так:

lexanc:  lexandr.o lexanc.o scanner.o printtoken.o token.h lexan.h Number.o
    cc -o lexanc -lm lexandr.o lexanc.o scanner.o printtoken.o Number.o
...
Number.o: Number.c Number.h lexan.h
    cc -c Number.c

lexanc.o: lexanc.c token.h lexan.h Number.h
    cc -c lexanc.c
...

Моя версия cc: laygr@xxx$ cc --version cc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3


person Lay González    schedule 05.02.2013    source источник
comment
Пожалуйста, предоставьте минимальный пример кода, который показывает это поведение. Это также полезно с информацией о компиляторе и ОС, а также о том, как вы компилируете код.   -  person HonkyTonk    schedule 06.02.2013


Ответы (2)


Библиотеки должны идти после всех объектов в опции компиляции. Измените его на:

lexanc:  lexandr.o lexanc.o scanner.o printtoken.o token.h lexan.h Number.o
    cc -o lexanc lexandr.o lexanc.o scanner.o printtoken.o Number.o -lm

Примечание -lm перемещено в конец.

person P.P    schedule 06.02.2013

Вы включаете math.h? Попробуйте добавить -Wall -ansi -pedantic в качестве аргументов командной строки компилятору C. Обычно для этой цели где-то есть определение CFLAGS.

EDIT
На самом деле это обычная проблема, о которой я совершенно забыл. Переместите -lm в конец списка параметров. Точнее, он должен быть после всех объектов. Подробнее см. в ответах на этот вопрос.

person D.Shawley    schedule 05.02.2013
comment
При компиляции или при линковке? - person Lay González; 06.02.2013
comment
Компиляция. Надеемся, что дополнительная информация даст некоторое представление о том, что происходит. Также может помочь дополнительный код. - person D.Shawley; 06.02.2013
comment
Я получил эту ошибку в дополнение: Number.c: 104: 9: предупреждение: ISO C90 запрещает смешанные объявления и код [-pedantic] - person Lay González; 06.02.2013
comment
строка 104 просто: int i = 0; Внутри и если, что имеет значение? - person Lay González; 06.02.2013
comment
В C90 (в отличие от C++ и C99) все объявления должны быть перед всеми операторами в ближайшем охватывающем блоке { ... }. Самый простой способ избавиться от этой жалобы — добавить -std=gnu99 в строки компиляции (сразу после -c). - person zwol; 06.02.2013
comment
@D.Shawley D.Shawley Вы явно ссылаетесь, если (а) вы получаете сообщение об ошибке, в котором упоминается адрес, и (б) вы используете параметр -l. - person user207421; 06.02.2013
comment
@EJP - первый комментарий был до того, как я понял, в чем проблема, и отредактировал свой ответ. - person D.Shawley; 06.02.2013