Сделал так как Вы написали, добавил в текущую папку всё из папки
'C:\Program Files\MATLAB\R2013a\extern\examples\mex'
ну и разумеется файлы проекта (исходник и заголовочные файлы), но всё равно выдаёт ошибку:
LINK : error LNK2001: неразрешенный внешний символ "mexFunction"
C:\Users\User\AppData\Local\Temp\mex_BLjGLN\templib.x : fatal error LNK1120: 1 неразрешенных внешних элементов
я так понимаю что то у меня не подключено, что то связано с mexFunction,
но mexfunction.c в текущем каталоге есть, ну и всё что связано с mex я скопировал
к тому же файл .mexwin64 уже появляется в рабочей папке, правда у него размер 0 байт, т.е. он пустой
пробовал разные исходники на С++, в конце концов, получается одно и тоже LINK : error LNK2001: неразрешенный внешний символ "mexFunction"
подскажите пожалуйста как это можно исправить
я так понимаю в сложившейся ситуации, даже если я и напишу всю функцию в нативном коде С++, она у меня в matlab не запустится всё равно ...
_________________Вот код QF.h
//
// MATLAB Compiler: 4.18.1 (R2013a)
// Date: Sat Apr 15 23:48:48 2017
// Arguments: "-B" "macro_default" "-W" "cpplib:QF" "-T" "link:lib" "-d"
// "C:\Users\User\Documents\MATLAB\QF\src" "-w"
// "enable:specified_file_mismatch" "-w" "enable:repeated_file" "-w"
// "enable:switch_ignored" "-w" "enable:missing_lib_sentinel" "-w"
// "enable:demo_license" "-v"
// "C:\Users\User\Documents\MATLAB\Cardi\стат_тесты\Q_filt.m"
//
#ifndef __QF_h
#define __QF_h 1
#if defined(__cplusplus) && !defined(mclmcrrt_h) && defined(__linux__)
# pragma implementation "mclmcrrt.h"
#endif
#include "mclmcrrt.h"
#include "mclcppclass.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__SUNPRO_CC)
/* Solaris shared libraries use __global, rather than mapfiles
* to define the API exported from a shared library. __global is
* only necessary when building the library -- files including
* this header file to use the library do not need the __global
* declaration; hence the EXPORTING_<library> logic.
*/
#ifdef EXPORTING_QF
#define PUBLIC_QF_C_API __global
#else
#define PUBLIC_QF_C_API /* No import statement needed. */
#endif
#define LIB_QF_C_API PUBLIC_QF_C_API
#elif defined(_HPUX_SOURCE)
#ifdef EXPORTING_QF
#define PUBLIC_QF_C_API __declspec(dllexport)
#else
#define PUBLIC_QF_C_API __declspec(dllimport)
#endif
#define LIB_QF_C_API PUBLIC_QF_C_API
#else
#define LIB_QF_C_API
#endif
/* This symbol is defined in shared libraries. Define it here
* (to nothing) in case this isn't a shared library.
*/
#ifndef LIB_QF_C_API
#define LIB_QF_C_API /* No special import/export declaration */
#endif
extern LIB_QF_C_API
bool MW_CALL_CONV QFInitializeWithHandlers(
mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler);
extern LIB_QF_C_API
bool MW_CALL_CONV QFInitialize(void);
extern LIB_QF_C_API
void MW_CALL_CONV QFTerminate(void);
extern LIB_QF_C_API
void MW_CALL_CONV QFPrintStackTrace(void);
extern LIB_QF_C_API
bool MW_CALL_CONV mlxQ_filt(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
/* On Windows, use __declspec to control the exported API */
#if defined(_MSC_VER) || defined(__BORLANDC__)
#ifdef EXPORTING_QF
#define PUBLIC_QF_CPP_API __declspec(dllexport)
#else
#define PUBLIC_QF_CPP_API __declspec(dllimport)
#endif
#define LIB_QF_CPP_API PUBLIC_QF_CPP_API
#else
#if !defined(LIB_QF_CPP_API)
#if defined(LIB_QF_C_API)
#define LIB_QF_CPP_API LIB_QF_C_API
#else
#define LIB_QF_CPP_API /* empty! */
#endif
#endif
#endif
extern LIB_QF_CPP_API void MW_CALL_CONV Q_filt(int nargout, mwArray& Out, const mwArray& u, const mwArray& n, const mwArray& m, const mwArray& q);
#endif
#endif
Вот код QF.cpp
//
// MATLAB Compiler: 4.18.1 (R2013a)
// Date: Sat Apr 15 23:48:48 2017
// Arguments: "-B" "macro_default" "-W" "cpplib:QF" "-T" "link:lib" "-d"
// "C:\Users\User\Documents\MATLAB\QF\src" "-w"
// "enable:specified_file_mismatch" "-w" "enable:repeated_file" "-w"
// "enable:switch_ignored" "-w" "enable:missing_lib_sentinel" "-w"
// "enable:demo_license" "-v"
// "C:\Users\User\Documents\MATLAB\Cardi\стат_тесты\Q_filt.m"
//
#include <stdio.h>
#define EXPORTING_QF 1
#include "QF.h"
static HMCRINSTANCE _mcr_inst = NULL;
#if defined( _MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__LCC__)
#ifdef __LCC__
#undef EXTERN_C
#endif
#include <windows.h>
static char path_to_dll[_MAX_PATH];
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void *pv)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
if (GetModuleFileName(hInstance, path_to_dll, _MAX_PATH) == 0)
return FALSE;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
#endif
#ifdef __cplusplus
extern "C" {
#endif
static int mclDefaultPrintHandler(const char *s)
{
return mclWrite(1 /* stdout */, s, sizeof(char)*strlen(s));
}
#ifdef __cplusplus
} /* End extern "C" block */
#endif
#ifdef __cplusplus
extern "C" {
#endif
static int mclDefaultErrorHandler(const char *s)
{
int written = 0;
size_t len = 0;
len = strlen(s);
written = mclWrite(2 /* stderr */, s, sizeof(char)*len);
if (len > 0 && s[ len-1 ] != '\n')
written += mclWrite(2 /* stderr */, "\n", sizeof(char));
return written;
}
#ifdef __cplusplus
} /* End extern "C" block */
#endif
/* This symbol is defined in shared libraries. Define it here
* (to nothing) in case this isn't a shared library.
*/
#ifndef LIB_QF_C_API
#define LIB_QF_C_API /* No special import/export declaration */
#endif
LIB_QF_C_API
bool MW_CALL_CONV QFInitializeWithHandlers(
mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler)
{
int bResult = 0;
if (_mcr_inst != NULL)
return true;
if (!mclmcrInitialize())
return false;
if (!GetModuleFileName(GetModuleHandle("QF"), path_to_dll, _MAX_PATH))
return false;
{
mclCtfStream ctfStream =
mclGetEmbeddedCtfStream(path_to_dll);
if (ctfStream) {
bResult = mclInitializeComponentInstanceEmbedded( &_mcr_inst,
error_handler,
print_handler,
ctfStream);
mclDestroyStream(ctfStream);
} else {
bResult = 0;
}
}
if (!bResult)
return false;
return true;
}
LIB_QF_C_API
bool MW_CALL_CONV QFInitialize(void)
{
return QFInitializeWithHandlers(mclDefaultErrorHandler, mclDefaultPrintHandler);
}
LIB_QF_C_API
void MW_CALL_CONV QFTerminate(void)
{
if (_mcr_inst != NULL)
mclTerminateInstance(&_mcr_inst);
}
LIB_QF_C_API
void MW_CALL_CONV QFPrintStackTrace(void)
{
char** stackTrace;
int stackDepth = mclGetStackTrace(&stackTrace);
int i;
for(i=0; i<stackDepth; i++)
{
mclWrite(2 /* stderr */, stackTrace[i], sizeof(char)*strlen(stackTrace[i]));
mclWrite(2 /* stderr */, "\n", sizeof(char)*strlen("\n"));
}
mclFreeStackTrace(&stackTrace, stackDepth);
}
LIB_QF_C_API
bool MW_CALL_CONV mlxQ_filt(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
return mclFeval(_mcr_inst, "Q_filt", nlhs, plhs, nrhs, prhs);
}
LIB_QF_CPP_API
void MW_CALL_CONV Q_filt(int nargout, mwArray& Out, const mwArray& u, const mwArray& n,
const mwArray& m, const mwArray& q)
{
mclcppMlfFeval(_mcr_inst, "Q_filt", nargout, 1, 4, &Out, &u, &n, &m, &q);
}
-- 16.04.2017, 15:06 --самого алгоритма там почему то нет, наверно он в библиотеках .lib, но они то же есть в рабочем каталоге
Код:
>> mcc -win64 -W cpplib:QF -T link:lib -d C:\Users\User\Documents\MATLAB\Out C:\Users\User\Documents\MATLAB\Cardi\стат_тесты\Q_filt.m
Warning: Adding path "C:\Users\User\Documents\MATLAB\Cardi\стат_тесты" to
Compiler path instance.
Код:
>> mex bolz2000_qc.cpp
LINK : error LNK2001: неразрешенный внешний символ "mexFunction"
C:\Users\User\AppData\Local\Temp\mex_BLjGLN\templib.x : fatal error LNK1120: 1 неразрешенных внешних элементов