Jump to content

Отсутствует nearbyintf в libm.so


Recommended Posts

Приветствую!

При сборке большого проекта под Keenetik обнаружилось остутствие функций типа nearbyintf в libm.so. Наверняка эти ф-ции как-то можно включить при сборке toolchain. Увы, используемая софтина слепо полагается на C99 и C++11, а условие присутствия этих функций в man определены так:

nearbyint(), nearbyintf(), nearbyintl():

_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L ||

_ISOC99_SOURCE;

or cc -std=c99

Что посоветуете?

Link to comment
Share on other sites

Очевидная мысль отредактировать c++config.h и пересобрать toolchain не помогла....

./build_dir/toolchain-mipsel-linux-uclibc/tools-mipsel-linux-mips32r2/mipsisa32r2el-unknown-linux-uclibc/include/c++/4.9.3/mipsisa32r2el-unknown-linux-uclibc/bits/c++config.h:

#undef _GLIBCXX_USE_C99_MATH_TR1

заменил на

#define _GLIBCXX_USE_C99_MATH_TR1 1

После чего make toolchain/clean и make

Может кто знает, как полностью пересобрать libm с этими расширениями?

Link to comment
Share on other sites

То, что вы просите, отсутствует в uclibc, поэтому собрать ваш проект не получится без дополнительной внешней либы или замены этих функций. Сейчас мы пытаемся все перенести под полноценную glibc, там эти функции присутствуют...

Link to comment
Share on other sites

Просто подождать?

Странно, на других OpenWRT таких проблем не было.

Или есть какой-то отдельный пакет с этими функциями и другими, собранными в отдельную либу?

Link to comment
Share on other sites

Просто подождать?
С очень большой долей вероятности можно выдрать нужные функции из libc и положить в отдельный файл исходников. И ждать не придётся. Пару-тройку раз удавалось.
Link to comment
Share on other sites

Как-то не вышло... эта и многие похожие ф-ции очень платформо зависимы и написаны на асме для соответствующей платформы. Выдирать без глубокого анализа не выйдет (для mips там даже нет ясного кода - похоже какой-то generic код идёт, для тех платформ, где нет специфичной asm реализации)...

Также удивило, что nearbyint есть, а nearbyintf нет - они, вроде, вместе должны были быть. Или я ошибаюсь? Может их явно вырезали зачем-то?

@McMCC а когда планируется ? Или можем в uclibc как-то это явно добавить?

Вообще, странно, __USE_ISOC99 должен и в uClibc это добавлять....

В итоге решил проблему путём добавления вот такого хака (без асма) в проект

(выдержка из сурсов самой uClibc)

#define WRAPPER1(func) \

float func##f (float x) \

{ \

return (float) func((double)x); \

}

WRAPPER1(nearbyint)

Теперь проверим как это всё живёт на практике.

Link to comment
Share on other sites

@McMCC а когда планируется ? Или можем в uclibc как-то это явно добавить?
Бросайте привязку к предложенному тулчейну и используйте свой. Или собирайте свою софтину в Entware, где необходимые вам функции в uclibc-ng присутсвуют, а билдрут как раз на основе OpenWrt'шного.
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...