ОШИБКА LNK2019 (Неразрешенный внешний символ) В VS2008 С ITK И FFTW - PullRequest
1 голос
/ 08 июля 2011

Я выполняю проект с ITK для обработки медицинских изображений.После большой работы больше не возникает ошибок компиляции, но в процессе компоновки у меня появляется следующая информация:

1> ------ Генерация запущена: proyect: prueba_r01, конфигурация:Отладка Win32 ------ 1> Связывание… 1> Создание библиотеки C: \ Documents and Settings \ GTTS \ Mis documents \ Visual Studio 2008 \ Projects \ prueba_r01 \ Debug \ prueba_r01.lib и объекта C: \ Documents and Settings \GTTS \ Mis Documentsmentos \ Visual Studio 2008 \ Projects \ prueba_r01 \ Debug \ prueba_r01.exp

1> prueba_r01.obj: ошибка LNK2019: внешний символ "public: double (* __thiscall prueba_r01 :: multiply_matrix_2D (multiply_matrix_2D (1006 *) [2], double () [2], int, int)) [2] "(? Multiply_matrix_2D @ prueba_r01 @@ QAEPAY01NPAY01N0HH @ Z) неразрешенная проблема, на которую ссылается функция" private: void __thiscall prueba_r01 ":: filterro (void) "(? filtro @ prueba_r01 @@ AAEXXZ)

1> C: \ Documents and Settings \ GTTS \ Mis documents / \ Visual Studio 2008 \ Projects \ prueba_r01 \ Debug \ prueba_r01.exe:фатальная ошибка LNK1120: 1 externos sin resolver

1> prueba_r01 - 2 ошибки, 0 предупреждений ========== Генератор: 0 исправлений, 1 неверных, 0 актуализированных, 0 пропущенных ==========

Метод multiply_matrix_2D выдает ошибку, когда вызывается внутри частного слота «фильтро ()» (переводится как фильтр). Заголовок файла:

#include <QtGui/QMainWindow>
#include "ui_prueba_r01.h"
#include "vicdef.h"
#include "itkImage.h"
#include "math.h"
#include <complex>
#include "fftw3.h"
using namespace std;

#define PI 3.14159265

class prueba_r01 : public QMainWindow
{
Q_OBJECT

public:
typedef double PixelType;
typedef itk::Image < PixelType, 2> ImageType;
    ImageType::Pointer imagen;

double** H;

prueba_r01(QWidget *parent = 0, Qt::WFlags flags = 0);
~prueba_r01();

void matrix2D_H(int ancho, int alto, double eta, double sigma);
fftw_complex* multiply_matrix_2D(fftw_complex* out, fftw_complex* H,int a, int b);

private slots:
void openRGB();
void filtro();


private:
Ui::prueba_r01Class ui;
};

#endif // PRUEBA_R01_H

И основная часть, гдепроблема находится в файле .cpp и отображается здесь:

fftw_complex* res ;
res = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*a*b);
fftw_complex* H_casted= reinterpret_cast<fftw_complex*> (&H);
res = multiply_matrix_2D(out,H_casted, a, b);

Процесс приведения ** двойного указателя на * fftw_complex выполняется здесь, потому что я хочу умножить фильтр в частотной области(H (w)) с результатом преобразования fft изображения, вот причина.Важно отметить, что fftw_complex имеет тип double [2], первая строка для реальной части, а вторая для мнимой. А проблемный метод показан ниже:

 fftw_complex* multiply_matrix_2D(fftw_complex* out, fftw_complex* H, int a ,int b){
/* The matrix out[axb] or [n0x(n1/2)+1] is the image after the FFT , and the           out_H[axb] is the filter in the frequency domain,
both are multiplied POINT TO POINT, it has to be called  twice, one for the imaginary part and another for the normal part
*/
 fftw_complex *res;
 res = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*a*b);
 for (int i0 = 0; i0<a ; i0++){
for (int i1 = 0; i1<b ; i1++){
 res[i1+a*i0][0] = out[i1+a*i0][0]*(H[0][0]+H[0][1]); // real part          
 res[i1+a*i0][1] = out[i1+a*i0][1]*(H[0][0]+H[0][1]); // imaginary part
    }
 }
 return res;
 }

Любая помощь будет действительно полезной!!Я совсем заблудился ... Спасибо!Gracias!Antonio

1 Ответ

2 голосов
/ 08 июля 2011

Измените заголовок функции в файле cpp на:

fftw_complex* prueba_r01::multiply_matrix_2D(fftw_complex* out, fftw_complex* H, int a, int b) 

Вы забыли имя класса (prueba_r01: :) в реализации, поэтому он не находит тело функции

...