Ошибка компиляции: `'error_category' не называет тип` с g ++ 6.3.0 - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь скомпилировать эту библиотеку C ++ / Python https://bitbucket.org/fluiddyn/fluidfft

Если установлен mpi4py, он работает хорошо.

Если mpi4py не установлен, код, который не использует MPI, не может быть скомпилирован.

Ошибка возникает во время компиляции файла Cython. Ошибка длинная и начинается с:

In file included from /usr/include/c++/6/bits/ios_base.h:46:0,
                 from /usr/include/c++/6/ios:42,
                 from /usr/include/c++/6/ostream:38,
                 from /usr/include/c++/6/iostream:39,
                 from src_cpp/base/base_fft.h:10,
                 from fluidfft/fft2d/fft2d_with_fftw1d.cpp:543:
/usr/include/c++/6/system_error:143:31: error: ‘error_category’ does not name a type
     error_code(int __v, const error_category& __cat) noexcept
                               ^~~~~~~~~~~~~~
/usr/include/c++/6/system_error:152:27: error: ‘error_category’ does not name a type
     assign(int __v, const error_category& __cat) noexcept
                           ^~~~~~~~~~~~~~
/usr/include/c++/6/system_error:172:11: error: ‘error_category’ does not name a type
     const error_category&
           ^~~~~~~~~~~~~~
/usr/include/c++/6/system_error:191:11: error: ‘error_category’ does not name a type
     const error_category*  _M_cat;

[...]

Я думаю, это может быть проблема C ++ 11 (http://en.cppreference.com/w/cpp/error/error_category), но я не понимаю, как решить эту проблему.

Команда компиляции:

g++ -pthread -fwrapv -O3 -Wall -Wno-unused-result -Wsign-compare -Wno-unused-result -Wsign-compare -fwrapv -O3 -Wall -fPIC -I/home/users/me/opt/miniconda3/include/python3.6m -I/home/users/me/opt/miniconda3/include -Isrc_cy -Ifluidfft/fft2d -Ifluidfft/fft3d -Isrc_cpp/base -Isrc_cpp/3d -Isrc_cpp/2d -Iinclude -I/home/users/me/opt/miniconda3/lib/python3.6/site-packages/numpy/core/include -c fluidfft/fft2d/fft2d_with_fftw1d.cpp -o build/temp.linux-x86_64-3.6/fluidfft/fft2d/fft2d_with_fftw1d.o

Редактировать минимальный, полный и проверяемый пример

Благодаря Ашвину Вишну (см. https://bitbucket.org/fluiddyn/fluidfft/issues/7/fluidfft-installation-fails-without-mpi4py), Я могу опубликовать минимальный пример

/* test.cpp */
#include <Python.h>
#include <string.h>
#include <stdio.h>

#include <cpu.h>

#include <sys/time.h>
#include <complex>
#include <iostream>


int main() {
  std::cout<<"Hello world";
  return 0;
}

скомпилировано из каталога liquidfft следующим образом:

g++ $(python-config --include) -Iinclude/ test.cpp

Если мы закомментируем cpu.h include, ошибок не будет.

Файл cpu.h был взят из кода pyfftw: https://github.com/pyFFTW/pyFFTW/blob/master/include/cpu.h

1 Ответ

0 голосов
/ 14 мая 2018

Это происходит из-за того, что исходные файлы Cython пакета liquidfft опирались на заголовочный файл C ++ cpu.h, в котором следующие строки препроцессора вызывали проблемы:

#if __STDC_VERSION__ >= 199901L
  /* "inline" is a keyword */
#else
# define inline
#endif

Я предполагаю, что новые компиляторы g ++ строго пересматривают зарезервированные ключевые слова. Следуя подсказкам из эссе о встроенных функциях , этот блок кода был заменен на:

#if __STDC_VERSION__ >= 199901L
  /* "inline" is a keyword */
#else
# define INLINE
#endif

#ifndef INLINE
# if __GNUC__ && !__GNUC_STDC_INLINE__
#  define INLINE static inline
# else
#  define INLINE inline
# endif
#endif
...