Ошибка создания Boost 1.49.0 с GCC 4.7.0

Я пытаюсь создать Boost 1.49.0 с использованием GCC 4.7.0 (MinGW). Я продолжаю получать следующее сообщение об ошибке несколько десятков раз:

C:\Tools\MinGW\бен../Library/GCC/i686-PC-mingw32/4.7.0/../../../../включают/С++/4.7.0/CMATH: 1096: 11: ошибка: ":: hypot" не была объявлена ​​

Строка 1096 cmath содержит

using ::hypot;

cmath включает math.h, который объявляет функцию hypot как

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

В обоих файлах несколько строк после тех, что указаны выше, являются идентичными операторами для функции hypotl (кроме типа long double вместо double), и это кажется счастливым.

Любые идеи, почему я получаю эту ошибку?

Ответ 1

Нашел ответ в этот пост форума. Похоже, что pyconfig.h имеет следующие строки:

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

но cmath, включенный в MinGW, ожидает, что функция будет называться hypot, а не _hypot, что вызывает ошибки компиляции.

Исправление состоит в том, чтобы включить следующее в параметр командной строки bjam cxxflags

bjam ... cxxflags="-include cmath "

Это означает, что g++ должен включать заголовок cmath в начале каждого исходного файла.

Ответ 2

Ответ @Praetorian правильно определяет проблему. С другой стороны, заголовки Python технически должны быть выше любых других. Кроме того, иногда принятое решение не работает или неудобно в системе сборки, поэтому я предложил альтернативное решение. Добавьте следующий флаг к вызову g++:

-D_hypot=hypot

Это делает так, что вредоносный макрос в заголовках Python становится неактивным, и ошибка компиляции исчезает.

Ответ 3

Насколько я вижу, это происходит при компиляции с помощью MingW, используя -std = С++ 0xx и включая Python.h перед cmath. И обратите внимание, что cmath включен в несколько других файлов заголовков... Обратите внимание, что проблема не связана с Boost. Усложнением является то, что в моей стандартной настройке кросс-компиляции MingW - Visual Studio Visual Studio 2010 нуждается в режиме отладки, чтобы включить Python.h перед многими другими стандартными файлами. Решение состоит в том, чтобы сначала включить cmath, а затем Python.h, поэтому вы получите код вроде:

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

Ответ 4

Проблема корректно идентифицируется @Praetorian.

В моем случае он появляется только в одном файле. Поэтому я просто добавляю

#define _hypot hypot до #include <Python.h>

и работает.

Надеюсь, это может быть просветляющим.

Ответ 5

Попробуйте просмотреть предварительно обработанный блок. Я думаю, вы найдете что-то вроде "#undef hypot".

Ответ 6

Я мог решить эту ошибку в кодовых блоках, когда я добавил следующий путь в компоновщик

C:\Python36-32\libs 

и поместите две библиотеки в библиотеки ссылок: libpython36.a и python36.lib.

Ответ 7

Добавить эту строку

#define _hypot hypot

в первом файле Python.h который хранится в вашем каталоге установки python. где-то вроде C:\Python27\include.