невозможно собрать библиотеку Брайана Гладмана - PullRequest
1 голос
/ 18 января 2011

Я собираю библиотеку Брайана Гладмана отсюда www.gladman.me.uk Я могу скомпилировать библиотеку на моей локальной машине (Ubuntu 10.10), но когда я пытаюсь скомпилировать на своей удаленной машине (CentOs 5.4), она генерируетмногочисленные ошибки с gcc ..

Здесь сгенерированы следующие ошибки:

thankx in adv ..

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Первая ошибка в вашей компиляции

brg_types.h:138:6: error: #error Please define uint_64t as an unsigned 64 bit type in brg_types.h

(раньше были только предупреждения, которые могут указывать на проблемы, но они не приводят к сбою компиляции.)

Проблема в том, что BRG_UI64 не был определен, точнее тип uint_64t. Определение имеет место ранее. Большинство следующих проблем существует из-за того, что uint_64t не определен, поэтому причина та же.

По сути, он ищет среди различных типов без знака первый, который имеет максимальное значение 18446744073709551615u, то есть полное 64-разрядное целое число без знака, и определяет его как uint_64t. Если тип не найден, вышеупомянутая ошибка возникает с помощью # error.

Похоже, что ни UINT_MAX, ни ULONG_MAX, ни ULLONG_MAX, ни ULONG_LONG_MAX не является 18446744073709551615 в вашей удаленной системе.

Вы можете проверить значения ваших констант с помощью простой программы

#include <limits.h>
#include <stdio.h>

int main()
{
  double d;

#if defined( UINT_MAX )
  d = UINT_MAX;
  printf("UINT_MAX is %f\n", d );
#if UINT_MAX == 18446744073709551615u
  printf("UINT_MAX satisfies condition\n");
#endif
#endif
#if defined( ULONG_MAX )
  d = ULONG_MAX;
  printf("ULONG_MAX is %f\n", d );
#if ULONG_MAX == 18446744073709551615ul
  printf("ULONG_MAX satisfies condition\n");
#endif
#endif
#if defined( ULLONG_MAX )
  d = ULLONG_MAX;
  printf("ULLONG_MAX is %f\n", d );
#if ULLONG_MAX == 18446744073709551615ull
  printf("ULLONG_MAX satisfies condition\n");
#endif
#endif
#if defined( ULONG_LONG_MAX )
  d = ULONG_LONG_MAX;
  printf("ULONG_LONG_MAX is %f\n", d );
#if ULONG_LONG_MAX == 18446744073709551615ull
  printf("ULONG_LONG_MAX satisfies condition\n");
#endif
#endif

  return 0;
}

В моей системе (и, возможно, также и в вашей) есть несколько версий limit.h и climits (которые включены в некоторые из c ++ - include). Вы можете найти их с помощью

find /usr/include -name '*limits*'

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

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

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

  • Один 32-битный компьютер, другой 64-битный
  • Другая версия gcc
  • Ubuntu и CentOS устанавливают разные ограничения. H

Вот код для тех, кто может лучше понять эти зависимые от платформы вещи, чем я.

#include <limits.h>
...
#ifndef BRG_UI64
#  if defined( __BORLANDC__ ) && !defined( __MSDOS__ )
#    define BRG_UI64
#    define li_64(h) 0x##h##ui64
     typedef unsigned __int64 uint_64t;
#  elif defined( _MSC_VER ) && ( _MSC_VER < 1300 )    /* 1300 == VC++ 7.0 */
#    define BRG_UI64
#    define li_64(h) 0x##h##ui64
     typedef unsigned __int64 uint_64t;
#  elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful
#    define BRG_UI64
#    define li_64(h) 0x##h##ull
     typedef unsigned long long uint_64t;
#  elif defined( __MVS__ )
#    define BRG_UI64
#    define li_64(h) 0x##h##ull
     typedef unsigned int long long uint_64t;
#  elif defined( UINT_MAX ) && UINT_MAX > 4294967295u
#    if UINT_MAX == 18446744073709551615u
#      define BRG_UI64
#      define li_64(h) 0x##h##u
       typedef unsigned int uint_64t;
#    endif
#  elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u
#    if ULONG_MAX == 18446744073709551615ul
#      define BRG_UI64
#      define li_64(h) 0x##h##ul
       typedef unsigned long uint_64t;
#    endif
#  elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u
#    if ULLONG_MAX == 18446744073709551615ull
#      define BRG_UI64
#      define li_64(h) 0x##h##ull
       typedef unsigned long long uint_64t;
#    endif
#  elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u
#    if ULONG_LONG_MAX == 18446744073709551615ull
#      define BRG_UI64
#      define li_64(h) 0x##h##ull
       typedef unsigned long long uint_64t;
#    endif
#  endif
#endif
0 голосов
/ 18 января 2011

Первая ошибка в brg_types.hat, строка 138;

brg_types.h:138:6: error: #error Please define uint_64t as an unsigned 64 bit type in brg_types.h

Я нашел здесь онлайн-копию этого файла (возможно, другой версии).Поэтому вам нужно найти, как создать 64-битное целое число без знака, и добавить некоторые определения над этой строкой, например,

#define BRG_UI64
#define li_64(h) 0x##h##ull
typedef unsigned long long uint_64t;

, если unsigned long long 64-битный, и вы вводите литеральные числа, например 0x123456789ull.

И, похоже, для компиляции на вашем компиляторе потребуется больше портирования.

...