LINUX.ORG.RU

Линковщик clang'а не видит функцию в заголовочном файле

 ,


0

1

Доброго времени суток.

Не получается собрать clang’ом, на win7+gcc то же самое собирается без проблем. Другие функции из math.h кроме powf(), powl() вызываются исправно. В чём может быть причина? Заранее спасибо.

#include        <stdio.h>
#include        <math.h>

int main(int argc, char *argv[]) {
    printf("%.f\n", pow(2, 3));

    return(0);
}
$ clang -v ./test.c -o ./test.o

OpenBSD clang version 11.1.0
Target: i386-unknown-openbsd7.0
Thread model: posix
InstalledDir: /usr/bin
 "/usr/bin/clang" -cc1 -triple i386-unknown-openbsd7.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test.c -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -target-cpu i586 -fno-split-dwarf-inlining -debugger-tuning=gdb -v -resource-dir /usr/lib/clang/11.1.0 -internal-isystem /usr/lib/clang/11.1.0/include -internal-externc-isystem /usr/include -fdebug-compilation-dir /home/red13/coding/c_lang -ferror-limit 19 -fwrapv -stack-protector 2 -fgnuc-version=4.2.1 -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -faddrsig -o /tmp/test-2c44c5.o -x c ./test.c
clang -cc1 version 11.1.0 based upon LLVM 11.1.0 default target i386-unknown-openbsd7.0
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/clang/11.1.0/include
 /usr/include
End of search list.
 "/usr/bin/ld" -e __start --eh-frame-hdr -Bdynamic -dynamic-linker /usr/libexec/ld.so -o ./test.o /usr/lib/crt0.o /usr/lib/crtbegin.o -L/usr/lib /tmp/test-2c44c5.o -lcompiler_rt -lc -lcompiler_rt /usr/lib/crtend.o
ld: error: undefined symbol: pow
>>> referenced by test.c
>>>               /tmp/test-2c44c5.o:(main)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ ls -lh /usr/include/math.h

-r--r--r--  1 root  bin  12.5K Oct 13 10:47 /usr/include/math.h

$ cat /usr/include/math.h | grep pow

double pow(double, double);
float powf(float, float);
long double powl(long double, long double);

ld: error: undefined symbol: pow

-lm

Другие функции из math.h кроме powf(), powl() вызываются исправно

Потому что компилятор заменяет функции типа sin() на __builtin_sin(), которые на самом деле не функции. Для некоторых функций есть такие встроенные конструкции, и для них связывание с libm не обязательно.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Благодарю тебя, добрый человек. На полном серьёзе и без сарказма.

tt
() автор топика
Ответ на: комментарий от LongLiveUbuntu

А -lm компилятору передавать Пушкин будет?

Чем стебаться над бедным быдлокодырем, сказал бы лучше почему ключа -lm нет ни в мануале clang, ни в хелпе. И откуда такая фича вообще появилась, раз так хорошо знаешь предмет.

tt
() автор топика
Ответ на: комментарий от tt

И откуда такая фича вообще появилась,

Это еще из первого стандарта языка такое, что математическую библиотеку отдельно держат. Для экономии. Соответственно про -lm можно прочитать в K&R.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

У меня под лапой бумажная версия K&R и справочник шилдта, и ни в одной из 2х в главах о math.h ничего про -lm. Разупорись.

tt
() автор топика
Ответ на: комментарий от tt

сказал бы лучше почему ключа -lm нет ни в мануале clang, ни в хелпе.

Потому что clang - компилятор, а за библиотеки отвечает компоновщик.

LamerOk ★★★★★
()
Ответ на: комментарий от tt

А мануал на функцию тебе, дегенерату, чем не подходит?

POW(3)                  Linux Programmer's Manual                 POW(3)
NAME         top
       pow, powf, powl - power functions
SYNOPSIS         top
       #include <math.h>

       double pow(double x, double y);
       float powf(float x, float y);
       long double powl(long double x, long double y);

       Link with -lm.
LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Нет. Именно компилятор отвечает за набор библиотек по умолчанию и обычно компилятор вызывает линкер.

X512 ★★★★★
()
Ответ на: комментарий от LamerOk

Linux Programmer’s Manual

У автора темы OpenBSD, может там по другому. Например в Haiku вместо -lc -lm -lpthread одна библиотека -lroot.

X512 ★★★★★
()
Ответ на: комментарий от X512

Именно компилятор отвечает за набор библиотек по умолчанию

Компилятор, который занимается компиляцией, не может знать набор библиотек «по умолчанию». Это может знать только компоновщик (и/или фронтенд ко всей этой машинерии), который может быть частью «компилятора» - как пакета программ для разработки.

может там по другому.

И об этом он тоже должен узнать из документации на свою среду разработки.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Компилятор, который занимается компиляцией, не может знать набор библиотек «по умолчанию».

И да, у шланга вообще не было компоновщика на некоторые платформы очень длительное время. Т.е. компилировать им можно было, а компоновать уже надо было сторонним компоновщиком.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Это может знать только компоновщик (и/или фронтенд ко всей этой машинерии), который может быть частью «компилятора» - как пакета программ для разработки.

Компоновщик как раз ничего не знает. Он получает список библиотек по умолчанию от компилятора. Попробуйте слинковаять через gcc/clang test-app.o -o test-app и ld/ld.lld/mold test-app.o -o test-app и заметьте разницу.

X512 ★★★★★
()
Ответ на: комментарий от X512

Компоновщик как раз ничего не знает.

4.2

Компоновщик будет вести себя так, как его реализуют разработчики компоновщика. Без чтения документации делать догадки о его поведении нельзя. Кроме того, дефолтные библиотеки могут быть забиты во фронтенде, к примеру, и отключаться каким-нибудь /nostdlib.

LamerOk ★★★★★
()
Ответ на: комментарий от tt

https://nixdoc.net/man-pages/OpenBSD/man3/pow.3.html
Сразу видно настоящего Специалиста!

Почему я могу за три секунды найти эти строчки:


INTRO(3)	Library Functions Manual	INTRO(3)
NAME
intro — introduction to the C libraries

SYNOPSIS
cc	[flags] file ... [-llibrary]
DESCRIPTION
The manual pages in section 3 provide an overview of the C library functions, their error returns, and other common definitions and concepts. Most of these functions are available from the C library, libc. Other libraries, such as the math library, libm, must be indicated at compile time with the -l option of the compiler.

а ты - нет?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Почему я могу за три секунды найти эти строчки: …

Потому что Вы достаточно откушали собачатины в процессе использования языка+компилятора и хорошо его изучили, а я ещё пока нет. И про intro(3) в сишные библиотеки, извините, первый раз слышу. Но хотя бы понял, откуда искать в следующий раз. Спасибо.

tt
() автор топика
Последнее исправление: tt (всего исправлений: 1)
Ответ на: комментарий от X512

И где гарантия, что этими компоновщиками исчерпывается поведение всех когда-либо существовавших компоновщиков во вселенной?

LamerOk ★★★★★
()

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

utanho ★★★★★
()
Ответ на: комментарий от utanho

Забыли указать используемую библиотеку, а виноват оказывается Clang…

Насколько мне известно -lm в список библиотек по умолчанию не входит.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Для *NIX платформ можно считать исчерпывающим.

AIX и HP-UX (не говоря уж о солярках с ирисками) смотрят на тебя с укоризной.

до оффтопика дела нет.

И какое отношение твое личное отношение к оффтопику имеет к вопросу о компоновке исполняемых файлов?

LamerOk ★★★★★
()
Ответ на: комментарий от X512

Забыли указать используемую библиотеку, а виноват оказывается Clang…

Я не виню кланг ни в чем. Написал ровно то, что написал. Кланг возможно и неплох, но для простого обывателя его преимущества неочевидны. А вот разные телодвижения постоянно требуются. В отличии от гцц

utanho ★★★★★
()
Ответ на: комментарий от utanho

А вот разные телодвижения постоянно требуются. В отличии от гцц

Меньше всего телодвижений если использовать компилятор по умолчанию из дистрибутива. В FreeBSD/MacOS наоборот будет меньше телодвижений с Clang.

X512 ★★★★★
()

-ld добавь, насколько я понял так исторически сложилось

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от X512

В FreeBSD/MacOS наоборот будет меньше телодвижений с Clang.

С этим вроде никто и не спорит.

utanho ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.