c++ - vs2017 - GCC 4.7.0でBoost 1.49.0をビルドする際のエラー




vs2017 boost build (4)

@Praetorianによる答えは問題を正しく示しています。 一方、Pythonヘッダーは技術的に他のものの前に来るように意図されています。 また、時には受け入れられたソリューションが動作しないか、ビルドシステムに不便な場合があるため、別の解決策を思いつきました。 g ++の呼び出しに次のフラグを追加します。

-D_hypot=hypot

これにより、Pythonヘッダー内の有害なマクロがノーオペレーションになり、コンパイルエラーがなくなるようにします。

私はBoost 1.49.0をGCC 4.7.0(MinGW)を使ってビルドしようとしています。 私は次のエラーメッセージを何十回も取得し続けます:

c:\ tools \ mingw \ bin .. / lib / gcc / i686-pc-mingw32 / 4.7.0 /../../../../ include / c ++ / 4.7.0 / cmath:1096:11 :エラー: ':: hypot'は宣言されていません

cmath行1096には

using ::hypot;

cmathは、 hypot関数を次のように宣言するmath.hが含まれています。

extern double __cdecl hypot (double, double); /* in libmoldname.a */

どちらのファイルでも、上に引用した行の後の2行は、 hypotl関数のための同一の文です(ただし、型はlong doubleではなくdouble )。

なぜこのエラーが発生しているのですか?


このフォーラムの投稿で答えを見つけました。 pyconfig.hには次のような行があるようです:

#if defined(__GNUC__) && defined(_WIN32)
// ...
#define hypot _hypot
// ...
#endif /* GNUC */

MinGWに含まれているcmathは、コンパイルエラーを引き起こす_hypotではなく_hypotという名前の関数を期待しています。

この修正は、私のbjamコマンドラインのcxxflagsオプションに以下を含めることでした

bjam ... cxxflags="-include cmath "

これは、g ++がすべてのソースファイルの先頭にcmathヘッダーを含めるべきであることを示しています。


前処理されたユニットを見てみてください。 あなたは "#undef hypot"のようなものを見つけるでしょう。


私が見る限り、これはMingWでコンパイルするときに-std = c ++ 0xxを使用し、cmathの前にPython.hを含めたときに発生します。 そして、cmathはその他のいくつかのヘッダファイルに含まれていることに注意してください...問題はBoost特有ではないことに注意してください。 複雑な事実は、私の標準MingW - Visual Studioのクロスコンパイルセットアップでは、Visual Studio 2010は多くの標準インクルードファイルの前にPython.hを含めるためにデバッグモードが必要です。 解決策は、最初にcmathを、その後にPython.hを含めることです。そうすれば、次のようなコードが得られます。

#include <cmath>
#include <Python.h>
#include < other standard headers >