2010-12-30 3 views
3

К сожалению, я вынужден использовать gcc 3.2.3 (MinGW) из-за базы стороннего кода, имеющей проблемы с более поздними версиями НКА.Невозможно построить полезную библиотеку yaml-cpp (совместно используемую или статическую) с gcc 3.2.3 в Windows

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

C:/MinGW_2/bin /../ lib/gcc-lib/mingw32/3.2.3 /../../../ libstdC++ . (с ++ locale.o) (. т доб + 0x38c): неопределенная ссылка на `strtold»

я получаю ту же ошибку при попытке создать общую библиотеку YAML-CPP

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

Любые идеи?

+0

У меня нет доступа к gcc 3.2.3, но вы можете увидеть, можете ли вы использовать 'std :: stringstream' и читать в' long's (или 'long long's)? Например, попробуйте 'std :: stringstream stream; поток << "5"; long n; stream >> n; ' –

+0

Конечно, это приводит к той же ошибке. – Gerry

ответ

0

Похоже, что внутри страны, 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 }; }; 
+0

Спасибо за предложение. Я закончил удаление каждой ссылки на длинный проект, и это все равно дает мне такую ​​же ошибку, после чистки и всех. Имеет ли это смысл? Может быть, stringstream использует longs внутри? – Gerry

+0

Хммм. Можете ли вы использовать 'stringstream' в целом? (например, просто объявите переменную 'std :: stringstream' - будет ли она связана?) –

+0

Нет - уверен, не может. Такая же ошибка. Похоже, мне не повезло. – Gerry

2

я смог получить эту работу, определив свою собственную 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 - единственная используемая версия.

Смежные вопросы