3

残念ながら、サードパーティのコードベースに gcc の新しいバージョンで問題があるため、gcc 3.2.3 (MinGW) を使用せざるを得ません。

gcc 3.2.3 では、(CMakeLists.txt ファイルを編集して「set(LIB_TYPE SHARED)」を削除することにより) 静的ライブラリ (yaml-cpp.a) を問題なくビルドできますが、アプリケーションを常に次のエラーが発生します。

C:/MinGW_2/bin/../lib/gcc-lib/mingw32/3.2.3/../../../libstdc++.a(c++locale.o)(.t ext+0x38c): 「strtold」への未定義の参照

共有 yaml-cpp ライブラリをビルドしようとすると、同じエラーが発生します。

Web を少し検索した後、ほとんどのプロジェクトでは「strtold」の代わりに「strtod」を使用してこの問題を解決しているようですが、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

確かに、これは非常にハックですが、仕事は完了します。gcc のマイナー リビジョンもチェックできればいいのですが、gcc 3.2.3 しか使用されていない私の環境ではこれで十分です。

于 2010-12-31T03:18:15.460 に答える
0

内部でstd::stringstreamが を呼び出しているようstroldです。残念ながら、これは切り替えることができないことを意味しますstrtod。単にその特定の変換を使用することはできません。

yaml-cpp はその変換を行うために使用するため、関連する変換std::stringstreamを削除することをお勧めします。longでは、次のような に関連する特殊化をyaml-cpp/traits.h削除します。is_numericlong

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