Matlab / Microsoft Visual C ++ 2010 Express: Что такое «ошибка LNK2019: неразрешенный внешний символ»? - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь создать простой класс C ++ и mex-файл Matlab. Мой код выглядит следующим образом:

Matlab: mexTest1.cpp

#include "mex.h"
#include "K:\\My Documents\\Visual Studio 2010\\Projects\\HelloWorld\\HelloWorld\\Class1.h"

/* Input Arguments */
#define X   prhs[0]

/* Output Arguments */
#define RESULT  plhs[0]

void mexFunction( int nlhs, mxArray *plhs[], 
          int nrhs, const mxArray *prhs[] ){ 
    /* Initialize input and output pointers
    // Inputs */
    double *x; 
    /* Outputs */
    double r;
    double *result; 

    mwSize m,n; 

    m = mxGetM(X); 
    n = mxGetN(X); 

    /* Create a matrix for the return argument */ 
    RESULT = mxCreateDoubleMatrix(1, 1, mxREAL);
    /* Assign pointers to the various parameters */ 
    result = mxGetPr(RESULT);

    x = mxGetPr(X);

    /* Do the actual computations in a subroutine */
    Class1 c1(2, 15.0);
    r = c1.product();

    result[0] = r;
    return;

}

Class1.h:

#pragma once

#include <string> // Standard string class in C++

class Class1
{
public:
    int a;
    double b;
public:
    Class1(const int& a, const double& b);
    //virtual ~Class1();
    void print() const;
    double product() const;
};

Class1.cpp:

#include "stdafx.h"
#include <iostream>
#include "Class1.h"

Class1::Class1(const int& a, const double& b){
    Class1::a = a;
    Class1::b = b;
}

void Class1::print() const{
    std::cout << "a=" << Class1::a << " * b=" << Class1::b << " = " << Class1::product() << std::endl;
}

double Class1::product() const{
    return a*b;
}

Выполнение команды Matlab mex mexTest1.cpp выдает сообщения об ошибке:

Creating library C:\DOCUME~1\K\LOCALS~1\TEMP\MEX_RH~1\templib.x and object C:\DOCUME~1\K\LOCALS~1\TEMP\MEX_RH~1\templib.exp 
mexTest1.obj : error LNK2019: unresolved external symbol "public: double __thiscall Class1::product(void)const " (?product@Class1@@QBENXZ) referenced in function _mexFunction 
mexTest1.obj : error LNK2019: unresolved external symbol "public: __thiscall Class1::Class1(int const &,double const &)" (??0Class1@@QAE@ABHABN@Z) referenced in function _mexFunction 
mexTest1.mexw32 : fatal error LNK1120: 2 unresolved externals 

  C:\PROGRA~1\MATLAB\R2011A\BIN\MEX.PL: Error: Link of 'mexTest1.mexw32' failed. 

??? Error using ==> mex at 208
Unable to complete successfully.

Может кто-нибудь помочь мне решить эту проблему?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

Компоновщик сообщает, что при попытке создать исполняемый файл не был предоставлен объектный файл, содержащий Class1::product и Class1::Class1. Это потому, что эти функции будут предоставлены компиляцией Class1.cpp, которую ваша командная строка не запрашивает.

Вы должны использовать синтаксис mex для нескольких файлов : mex mexTest1.cpp Class1.cpp

2 голосов
/ 17 июня 2011

Ваш компоновщик не может найти определения (тела) методов Class1 (конструктор и продукт).Это может быть связано с

  1. Вы не предоставили никакого определения (body)
  2. Определения находятся в файле lib, который вы забыли связать с
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...