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