LINUX.ORG.RU

Компиляция с sysroot для armv7hf (линковка библиотек ncurses)

 , ,


0

1

При сборке кода командой:

/opt/cross/arm-cortexa7hf-linux-gnueabi/bin/arm-cortexa7hf-linux-gnueabi-gcc -o test-bin -ltinfo test.c
Выдается следующая ошибка:
In file included from /opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/endian.h:60:0,
                 from /opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/sys/types.h:216,
                 from /opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/termcap.h:49,
                 from test3.c:517:
/opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/bits/byteswap.h: In function 'main':
/opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/bits/byteswap.h:44:1: error: invalid storage class for function '__bswap_32'
 __bswap_32 (unsigned int __bsx)
 ^
/opt/cross/arm-cortexa7hf-linux-gnueabi/arm-cortexa7hf-linux-gnueabi/sysroot/usr/include/bits/byteswap.h:75:1: error: invalid storage class for function '__bswap_64'
 __bswap_64 (__uint64_t __bsx)
 ^
Подскажите, по какой причине это происходит?
У меня по этой причине ни одна утилита/библиотека не собирается с поддержкой ncurses.



Последнее исправление: dmnord (всего исправлений: 2)

byteswap.h покажи

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

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)

arm-cortexa7hf-linux-gnueabi

генто-арче макаки должны страдать

anonymous
()
Ответ на: комментарий от SZT

Вот ссылка, но там не весь файл, а только часть кода:
http://pastebin.com/9EaVCXkS
Стрелкой я пометил строку 44 в которой происходит ошибка.

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

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

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

Это как?

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

Запустил gcc с параметром -E и в итоге получил следующее:
http://pastebin.com/mKFG09aN
Честно скажу, мне ничего не понятно, если можно помогите. Если надо - тыкните носом. Это для меня дебри, в которые я лезу по мере надобности. Усугубляет ситуацию отсутствие теоретической базы.

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

Проблема твоя в том, что у тебя внутри

int
main ()
{
задекларированы какие-то функции. Похоже что ты тупо напихал инклудов прямо непосредственно в main, и у тебя внутри майна всунулась функция
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
  return __builtin_bswap32 (__bsx);
}

И действительно, если ты попробуешь вот такой код скомпилировать:

int
main ()
{
  static __inline unsigned int
  __bswap_32 (unsigned int __bsx)
  {
    return __builtin_bswap32 (__bsx);
  }
}
тебе компилятор выдаст ошибку invalid storage class.

Инклуды и дефайны иногда некоторые личности вставляют внутрь кода функции, но в общем случае я так делать не советую. Если ты объявляешь какие-то как бы локальные дефайны внутри функции, не забудь их отUNDEFить в конце функции, чтобы они другой код не аффектили

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

Дело на самом деле обстоит несколько по-другому.

Этот код написал не я. Я его лишь скопировал и запустил вручную для проверки. Содержится он в скрипте configure, и компилируется он на этапе проверки в бинарный файл conftest, как и положено. При этом строка сборки gcc идет с параметром -ltinfo (на самом деле там проверяются 4 библиотеки ncurses).

Без указания этого параметра линковки с библиотеками ncurses, код компилируется замечательно.

Использую версию ncurses 6.0. Прихожу к мысли, что надо перейти на версию ниже. Хотя проблема возможно и не в этом.

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

Ну у тебя там в http://pastebin.com/mKFG09aN коде какой-то бред написан. Там внутри main{} объявлена static __inline unsigned int функция. Не может это скомпилироваться никак. Похоже что кто-то заинклудил .h файл внутри main и оттого так получилось. Проблема явно в этом. Так делать нельзя. Там ошибка в коде

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

И если ты перейдешь на более старую версию ncurses, ошибку в коде это не исправит

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

А вот глянь сообщения, появляющиеся при компиляции osl-библиотеки готовым toolchain'ом для Cortex-A7, собранным мною.

./openscop-0.9.0/source/statement.c: In function 'osl_statement_pprint':
./openscop-0.9.0/source/statement.c:238:19: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
     fprintf(file, "%lu\n\n", nb_relations);
                   ^
./openscop-0.9.0/source/relation_list.c: In function 'osl_relation_list_pprint':
./openscop-0.9.0/source/relation_list.c:305:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
     fprintf(file,"# List of %lu elements\n%lu\n", i, i);
                  ^
./openscop-0.9.0/source/relation_list.c:305:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=]
./openscop-0.9.0/source/relation_list.c:307:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
     fprintf(file,"# List of %lu element \n%lu\n", i, i);
                  ^
./openscop-0.9.0/source/relation_list.c:307:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=]
./openscop-0.9.0/source/util.c: In function 'osl_util_read_uptoflag':
./openscop-0.9.0/source/util.c:349:39: warning: 'lenstr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   while (((str  != NULL) && (nb_chars != lenstr)) ||
Как я представляю, это несоответствие типов данных, на которые ругается gcc.
Что ты можешь сказать по поводу этих сообщений? Может такое, что я в каких-то параметрах сборки компонентов toolchain'а (последние версии binutils, gcc, glibc)?

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

Это варнинг на принтф. Чтоб принтф-нуть size_t надо использовать не %lu. Используй %zu
Можешь почитать man 3 printf

z A following integer conversion corresponds to a size_t or ssize_t argument. (Linux libc5 has Z with this meaning. Don't use it.)

http://stackoverflow.com/a/2524675 вот тебе ссылка на стековерфлоу еще. Ответы на подобные вопросы можно элементарно найти, вбив ошибку компиляции в гугл https://www.google.com/search?channel=fs&q= format '%lu' expects argument...

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

Короче, без обид, но советую выучить как следует Си, чтоб не возникали такие глупые вопросы

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

:) стараюсь вот изучать полным ходом. Спасибо огромное за помощь. Хотя проблема для меня не ясна, но это пока. Буду копать.

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