LINUX.ORG.RU

При компиляции Qt/Android приложения недоступен bits/wordsize.h. Как это обойти?

 , , ,


0

1

Среда: 64 bit Linux, Qt 5.9.2, QtCreator 4.4.1, gcc 6.3.0.

В коде имеется инклюд:

#include  <bits/wordsize.h>

Он нормально компилируется в desktop-режиме. Но при сборке проекта под Android, данный заголовок недоступен:
fatal error: bits/wordsize.h: No such file or directory
    #include  <bits/wordsize.h>
                               ^
compilation terminated.

Как обойти эту проблему?

★★★★★

Как обойти эту проблему?

Не использовать приватные заголовки библиотек будет наилучшим вариантом, они же не переносимы.

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

Что значит «приватные заголовки»?

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

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

Это заголовки, которые содержат общую часть публичных заголовков. Они не являются частью публичного интерфейса и не должны включаться явно.

Надо убрать зависимость (у меня там всего 13 строк). Если нужен __WORDSIZE, то найти чем его заменить, смотря где оно вообще используется.

xaizek ★★★★★ ()

ты чего-то недоговариваешь, поэтому решение состоит в том, чтоб сказать тебе что ты лох.

ckotinko ☆☆☆ ()
Ответ на: комментарий от kshmr

ну я просто пользуюсь компилятором gcc и знаю что он пишет как именно инклудились файлы перед тем как сообщить об собственно об ошибке.

ckotinko ☆☆☆ ()
Ответ на: комментарий от xaizek

Не использовать приватные заголовки библиотек будет наилучшим вариантом, они же не переносимы.

Кстати, а почему ты считаешь, что это приватные заголовки библиотек?

https://fossies.org/dox/glibc-2.27/sysdeps_2unix_2sysv_2linux_2powerpc_2bits_...

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

а почему ты считаешь, что это приватные заголовки библиотек?

А найди-ка нам в документации к библиотеке предложение заиклюдить bits/wordsize.h.

i-rinat ★★★★★ ()
Ответ на: комментарий от Xintrea

В bits/ лежат непереносимые детали реализации тулчейна. Просто убери этот #include и посмотри что за ошибки вылезут. Дальше чини эти ошибки.

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

Установка glibc должна помочь. По-крайней мере, этот хидер лежит в ней.

Угу, а когда кросскомпилируешь в Qt под Android через arm-linux-androideabi-g++, этот компилер таковой заголовок найти не может.

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

В bits/ лежат непереносимые детали реализации тулчейна. Просто убери этот #include и посмотри что за ошибки вылезут. Дальше чини эти ошибки.

Я не владелец кода. Мне эту библиотеку дают как готовую, в виде исходников.

Я помучил разработчика, и вот что выяснил.

Он этот <bits/wordsize.h> вроде как использует для того, чтобы определить, доступны ли на текущей платформе long-варианты математических функций, то есть sinl(), cosl() и т. п. из библиотеки <math.h>. Если long-вариантов нет, он дефайнит sinl на sin, cosl на cos и т.д.

Вот проблемный кусочек:

#ifdef __linux
   #include  <bits/wordsize.h>
   #ifdef __NO_LONG_DOUBLE_MATH
   #undef HAVE_LONG_DOUBLE
   #endif// __NO_LONG_DOUBLE_MATH

   #ifdef __sparc__
      #undef _FLASH_
      #undef HAVE_WATHCDOG
      #define SPEED_4FASTER
      #define HAVE_LONG_DOUBLE
      #ifdef MCBC
         #define BECTEP_CHECK_RECEIVER
      #endif // MCBC
      #define OLDLINUX
      #undef USE_INOTIFY
   #endif // __sparc__

   #if defined(__arm__) || defined(__sparc__)
      #ifndef HAVE_LONG_DOUBLE
         #define atan2l atan2
         #define sinl sin
         #define cosl cos
         #define sqrtl sqrt
         #define fabsl fabs
         #define fmodl fmod
         #define asinl asin
      #endif // HAVE_LONG_DOUBLE
   #endif // defined(__arm__) || defined(__sparc__)
#endif // __linux


Причем из самого кода я не вижу, чтобы дефайны из <bits/wordsize.h> использовались далее в коде. Возможно, что на других платформах в <bits/wordsize.h> есть дефайны, которые на что-то могут повлиять.

В общем, мне ему нужно предложить какой-нибудь более человеческий вариант определения, есть ли на платформе long-варианты математических функций.

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

Для этого существует этап конфигурации сборки, в ходе которого выпоняются проверки на API.

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

#ifdef __linux

Откуда вообще это взялось, стандартный макрос это __linux__. Ощущение, что разработчик этой либы писал её исключительно для своего локалхоста, тулчейна, архитектуры и битности. Отчего вопрос что это вообще за либа и действительно ли ей нет альтернативы.

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