PoltoS Posted April 5, 2016 Posted April 5, 2016 Приветствую! При сборке большого проекта под 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 Что посоветуете?
PoltoS Posted April 5, 2016 Author Posted April 5, 2016 Очевидная мысль отредактировать 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 с этими расширениями?
McMCC Posted April 6, 2016 Posted April 6, 2016 То, что вы просите, отсутствует в uclibc, поэтому собрать ваш проект не получится без дополнительной внешней либы или замены этих функций. Сейчас мы пытаемся все перенести под полноценную glibc, там эти функции присутствуют...
PoltoS Posted April 6, 2016 Author Posted April 6, 2016 Просто подождать? Странно, на других OpenWRT таких проблем не было. Или есть какой-то отдельный пакет с этими функциями и другими, собранными в отдельную либу?
Александр Рыжов Posted April 6, 2016 Posted April 6, 2016 Просто подождать?С очень большой долей вероятности можно выдрать нужные функции из libc и положить в отдельный файл исходников. И ждать не придётся. Пару-тройку раз удавалось.
PoltoS Posted April 6, 2016 Author Posted April 6, 2016 Как-то не вышло... эта и многие похожие ф-ции очень платформо зависимы и написаны на асме для соответствующей платформы. Выдирать без глубокого анализа не выйдет (для 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) Теперь проверим как это всё живёт на практике.
McMCC Posted April 6, 2016 Posted April 6, 2016 И что работает? Это же какая-то заглушка, там гораздо увесистая функция, чем этот врапер...
Александр Рыжов Posted April 7, 2016 Posted April 7, 2016 @McMCC а когда планируется ? Или можем в uclibc как-то это явно добавить?Бросайте привязку к предложенному тулчейну и используйте свой. Или собирайте свою софтину в Entware, где необходимые вам функции в uclibc-ng присутсвуют, а билдрут как раз на основе OpenWrt'шного.
Recommended Posts