Невозможно создать используемую библиотеку yaml-cpp (совместно используемую или статическую) с gcc 3.2.3 в Windows - PullRequest
3 голосов
/ 30 декабря 2010

К сожалению, я вынужден использовать gcc 3.2.3 (MinGW) из-за проблем со сторонней кодовой базой в более поздних версиях gcc.

С gcc 3.2.3 я могу создать статическую библиотеку (yaml-cpp.a) очень хорошо (отредактировав файл CMakeLists.txt, чтобы удалить 'set (LIB_TYPE SHARED)', но я не могу связать свою приложение к библиотеке. Это всегда приводит к следующей ошибке:

C: / MinGW_2 / бен /../ Библиотека / GCC Пб / mingw32 / 3.2.3 /../../../ libstdc ++, а (C ++ locale.o) (т.. ext + 0x38c): неопределенная ссылка на `strtold '

Я получаю ту же ошибку при попытке создать общую библиотеку yaml-cpp.

После небольшого поиска в Интернете большинство, похоже, решают эту проблему в своих проектах, используя 'strtod' вместо 'strtold', но я не могу найти ссылку на 'strtold' в коде yaml-cpp; так что я немного растерялся?

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Я смог заставить это работать, определив мой собственный strtold, который использует strtod:

#if (__MINGW32__) && (__GNUC__) && (__GNUC__ < 4)
extern "C" {
  long double strtold(const char *__restrict__ nptr, char **__restrict__ endptr) {
      return strtod(nptr, endptr);
  }
}
#endif

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

0 голосов
/ 30 декабря 2010

Похоже, что внутри std::stringstream вызывает strold. К сожалению, это означает, что вы не можете переключить его на strtod - вы просто не можете использовать именно это преобразование.

Поскольку yaml-cpp использует std::stringstream для выполнения конвертации, я предлагаю удалить long связанные конвертации. В yaml-cpp/traits.h удалите специализации is_numeric, связанные с long, например:

template <> struct is_numeric <long double> { enum { value = true }; };
...