3

不幸的是,由于第三方代码库与更高版本的 gcc 存在问题,我不得不使用 gcc 3.2.3 (MinGW)。

使用 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++.a(c++locale.o)(.t ext+0x38c):未定义对“strtold”的引用

尝试构建共享 yaml-cpp 库时出现相同的错误。

在网上搜索了一下之后,大多数人似乎在他们的项目中通过使用“strtod”而不是“strtold”来解决这个问题,但是我在 yaml-cpp 代码中找不到对“strtold”的任何引用;所以我有点茫然?

有任何想法吗?

4

2 回答 2

2

我可以通过定义我自己的使用 strtod 的 strtold 来实现它:

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

诚然,这很 hacky,但它完成了工作。我希望我也可以检查 gcc 的小版本,但这对于我的环境来说已经足够了,其中 gcc 3.2.3 是唯一使用的版本。

于 2010-12-31T03:18:15.460 回答
0

看来,在内部,std::stringstream正在调用strold. 不幸的是,这意味着您无法将其切换到strtod- 您根本无法使用该特定转换。

由于 yaml-cpp 用于std::stringstream进行转换,我建议删除long-related 转换。在yaml-cpp/traits.h中,删除is_numeric与 相关的特化long,例如:

template <> struct is_numeric <long double> { enum { value = true }; };
于 2010-12-30T15:36:44.683 回答