Кросс-компиляция библиотеки POCO для среды OpenWRT Linux с использованием цепочки инструментов OpenWRT

Я пытаюсь сделать кросс-компиляцию пакета исходного кода POCO для среды Linux OpenWRT, используя набор инструментов OpenWRT. Я скачал исходный пакет POCO и пытаюсь его скомпилировать, но я получаю журнал ошибок, как показано ниже

src/Error.cpp: In static member function 'static std::string
Poco::Error::getMessage(int)': src/Error.cpp:71:55: error: invalid
conversion from 'int' to 'const char*' [-fpermissive]
return std::string(strerror_r(errorCode, errmsg, 256));
                                                       ^
In file included from
/home/ubuntu/subhendu/options_cg/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_musl-1.1.10/mips-openwrt-linux-musl/include/c++/4.8.3/string:53:0,
                 from include/Poco/Bugcheck.h:24,
                 from include/Poco/Foundation.h:148,
                 from src/Error.cpp:17: /home/ubuntu/subhendu/options_cg/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_musl-1.1.10/mips-openwrt-linux-musl/include/c++/4.8.3/bits/basic_string.tcc:212:5:
error:   initializing argument 1 of 'std::basic_string<_CharT,
_Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' [-fpermissive]
     basic_string<_CharT, _Traits, _Alloc>::
     ^
/home/ubuntu/subhendu/Poco/poco-1.6.0/build/rules/compile:53: recipe for target
'/home/ubuntu/subhendu/Poco/poco-1.6.0/Foundation/obj/Linux/x86_64/debug_shared/Error.o'
failed make[1]: ***
[/home/ubuntu/subhendu/Poco/poco-1.6.0/Foundation/obj/Linux/x86_64/debug_shared/Error.o]
Error 1 make[1]: Leaving directory
'/home/ubuntu/subhendu/Poco/poco-1.6.0/Foundation' Makefile:69: recipe
for target 'Foundation-libexec' failed make: *** [Foundation-libexec]
Error 2

Если кто-то сталкивался с той же проблемой или имеет представление о том, как ее решить, пожалуйста, дайте свое решение...

1 ответ

Решение

Глядя на страницу руководства для strerror_r, я вижу:

int strerror_r(int errnum, char *buf, size_t buflen);
            /* XSI-compliant */
char *strerror_r(int errnum, char *buf, size_t buflen);
            /* GNU-specific */

Обратите внимание на разницу в типе возврата.

Глядя на ваше сообщение об ошибке:

error: invalid conversion from 'int' to 'const char*' [-fpermissive]
return std::string(strerror_r(errorCode, errmsg, 256));
                                                       ^

Похоже, что источник, который вы компилируете, ожидает специфической для GNU версии strerror_r, но получить XSI-совместимый. Либо ваша цель не обеспечивает расширение GNU, либо ваша цепочка инструментов настроена неправильно.

Справочная страница продолжается:

Требования к макрокоманде функционального тестирования для glibc (см. Feature_test_macros(7)): XSI-совместимая версия strerror_r() предоставляется, если:

(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE

В противном случае предоставляется GNU-специфичная версия.

Так что вы можете исследовать это направление. (Что такое _POSIX_C_SOURCE, _XOPEN_SOURCE а также _GNU_SOURCE установить, когда вы пытаетесь скомпилировать?)

Другие вопросы по тегам