Комбинация CImg и fftw++ не работает

Я хочу сделать fft в своем проекте С++ и потом показать его как изображение. Чтобы сделать fft, я использую fftw++, а для отображения изображения я хотел использовать CImg-библиотеку. Поэтому я начал с демонстрационного проекта здесь. При компиляции все работает. Как только я добавляю CImg-заголовок, происходит сбой с ошибкой

test.cpp: In function ‘int main()’:
test.cpp:18:12: error: ‘f’ was not declared in this scope
   Complex *f=ComplexAlign(n);

Мой файл выглядит так

#include "fftw++.h"
#include "CImg.h"
// Compile with:
// g++ -I .. -fopenmp example0.cc ../fftw++.cc -lfftw3 -lfftw3_omp

//using namespace std;
//using namespace utils;
//using namespace fftwpp;
//using namespace cimg_library;
int main()
{
  fftwpp::fftw::maxthreads=get_max_threads();

  std::cout << "1D complex to complex in-place FFT, not using the Array class"
       << std::endl;

  unsigned int n=4;
  Complex *f=utils::ComplexAlign(n);

  fftwpp::fft1d Forward(n,-1);
  fftwpp::fft1d Backward(n,1);

  for(unsigned int i=0; i < n; i++) f[i]=i;

  std::cout << "\ninput:" << std::endl;
  for(unsigned int i=0; i < n; i++) std::cout << f[i] << std::endl;

  Forward.fft(f);

  std::cout << "\noutput:" << std::endl;
  for(unsigned int i=0; i < n; i++) std::cout << f[i] << std::endl;

  Backward.fftNormalized(f);

  std::cout << "\ntransformed back:" << std::endl;
  for(unsigned int i=0; i < n; i++) std::cout << f[i] << std::endl;

  utils::deleteAlign(f);
}

и компилируется с

g++ -I .. -fopenmp test.cpp ../fftw++.cc -lfftw3 -lfftw3_omp

Моя версия g++ 4.8.5. Добавление заголовка Complex.h тоже не помогает. Что я могу сделать, чтобы объединить обе библиотеки?

Редактировать: Дальнейшие исследования показывают, что использование C-библиотеки complex.h и CImg.h приводит к множеству проблем компиляции, объединение библиотеки Complex.h из пакета fftw++ также приводит к ошибкам, только complex-include из C++ можно использовать вместе с CImg.h -включить файл. Причина: Неизвестна до сих пор.


person arc_lupus    schedule 07.04.2016    source источник
comment
Избавьтесь для начала от всего этого неуклюжего использования using namespace ......   -  person Paul R    schedule 07.04.2016
comment
@PaulR: исправлено, я оставил его раньше, чтобы оставаться как можно ближе к оригиналу. Все та же проблема   -  person arc_lupus    schedule 07.04.2016
comment
Я предполагаю, что Complex определено более чем в одном месте, но я не au fait с CImg или fftw++.   -  person Paul R    schedule 07.04.2016
comment
@PaulR: CImg не нравится сложное определение от fftw, но я понятия не имею, как это исправить.   -  person arc_lupus    schedule 07.04.2016
comment
Вероятно, вам нужно поместить простую оболочку C++ вокруг CImg и поместить ее в собственное пространство имен.   -  person Paul R    schedule 07.04.2016
comment
@PaulR: Решил, см. ответ.   -  person arc_lupus    schedule 08.04.2016
comment
Хорошо сделано - это в значительной степени то, что я имел в виду в комментарии выше об обертке вокруг CImg (за исключением того, что вам, похоже, не нужно было возиться с пространством имен).   -  person Paul R    schedule 08.04.2016


Ответы (1)


Мое решение (даже если оно не идеальное) состоит в том, что я создал второй файл cpp:
second.cpp:

#include "CImg.h"
//Code for images
void example(void){
}

и включаемый файл для этого:
second.h:

#ifndef SECOND_H
#define SECOND_H

void example(void);


#endif /* SECOND_H */

Если я включу только этот включаемый файл вместо CImg.h, я смогу использовать как fftw++, так и CImg.

person arc_lupus    schedule 08.04.2016