Невозможно использовать библиотеки C, которые включают math.h с g ++ 7 (Raspberry PI)

Я собрал GCC 7.2.0 для Raspberry PI и установил его с префиксом /usr/local/gcc-7.2.0 (с помощью этот урок). Всякий раз, когда я пытаюсь скомпилировать источник, который включает в себя библиотеку C, которая в свою очередь включает в себя math.h Я получаю странные ошибки. Ниже приведен минимальный пример:

extern "C" {
#include <libavcodec/avcodec.h>
}

int main() {
return 0;
}

Замечания: extern "C" здесь необходимо, потому что avcodec.h не имеет его Я уверен, что это не проблема, так как я попытался удалить его и все еще получаю ту же ошибку.

Компилирование с /usr/local/gcc-7.2.0/bin/g++-7.2.0 main.cppЯ получаю следующую ошибку:

In file included from /usr/local/include/libavutil/common.h:36:0,
from /usr/local/include/libavutil/avutil.h:296,
from /usr/local/include/libavutil/samplefmt.h:24,
from /usr/local/include/libavcodec/avcodec.h:31,
from main.cpp:4:
/usr/local/gcc-7.2.0/include/c++/7.2.0/math.h:65:12: error: ‘constexpr bool std::isinf(double)’ conflicts with a previous declaration
using std::isinf;
^~~~~
In file included from /usr/include/features.h:374:0,
from /usr/include/errno.h:28,
from /usr/local/include/libavcodec/avcodec.h:30,
from main.cpp:4:
/usr/include/arm-linux-gnueabihf/bits/mathcalls.h:201:1: note: previous declaration ‘int isinf(double)’
__MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__));
^
In file included from /usr/local/include/libavutil/common.h:36:0,
from /usr/local/include/libavutil/avutil.h:296,
from /usr/local/include/libavutil/samplefmt.h:24,
from /usr/local/include/libavcodec/avcodec.h:31,
from main.cpp:4:
/usr/local/gcc-7.2.0/include/c++/7.2.0/math.h:66:12: error: ‘constexpr bool std::isnan(double)’ conflicts with a previous declaration
using std::isnan;
^~~~~
In file included from /usr/include/features.h:374:0,
from /usr/include/errno.h:28,
from /usr/local/include/libavcodec/avcodec.h:30,
from main.cpp:4:
/usr/include/arm-linux-gnueabihf/bits/mathcalls.h:234:1: note: previous declaration ‘int isnan(double)’
__MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));
^

3

Решение

Вы столкнулись с глобальным пространством имен, потому что math.h объявляет имена C в глобальном пространстве имен.

Проблема в вашей версии mathcalls.h Есть патч, который исправляет это условно не определяя isnan а также isinf при использовании C ++ 11 или новее. Вот патч для mathcalls.h

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]