Я пытаюсь использовать совместно используемую библиотеку C ++, созданную с помощью deploytool в MATLAB в Visual C ++. Я получаю сообщение об ошибке: не удалось правильно инициализировать библиотеку.
Я последовал за:
http://www.mathworks.com/support/solutions/en/data/1-2QTWCE/ а также http://blogs.mathworks.com/loren/2011/02/03/creating-c-shared-libraries-and-dlls/ руководство.
Мой код: файл .cpp:
#include "stdafx.h"#include "try2.h"#include <iostream>
#include <string.h>
#include "mex.h"#include "mclmcr.h"#include "mclmcrrt.h"#ifdef _DEBUG
#pragma comment(lib, "try2.lib")
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclcommain.lib")
#pragma comment(lib, "mclbase.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "mclxlmain.lib")
#else
#pragma comment(lib, "try2.lib")
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclcommain.lib")
#pragma comment(lib, "mclbase.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "mclxlmain.lib")
#endif
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/* Call the MCR and library initialization functions */
if( !mclInitializeApplication(NULL,0) )
{
std::cerr << "Could not initialize the application properly."<< std::endl;
return -1;
}
try2Initialize();
if (!try2Initialize())
{
std::cerr << "Could not initialize the library properly."<< std::endl;
return -1;
}mwArray img= "C:/Users/Desktop/dressimages/T1k5aHXjNqXXc4MOI3_050416.jpg";
shoes(img);
try2Terminate();
mclTerminateApplication();
return 0;
}
и файл оболочки try2.cpp, сгенерированный из MATLAB
//
// MATLAB Compiler: 4.18 (R2012b)
// Date: Tue Apr 23 13:16:46 2013
// Arguments: "-B" "macro_default" "-W" "cpplib:try2" "-T" "link:lib" "-d"// "C:\UsersDocuments\MATLAB\try2\src" "-N" "-p" "vision" "-p"// "stats" "-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\Desktop\trial\shoes.m" "-a"// "C:\Users\Desktop\trial\color_space_file.mat"//
#include <stdio.h>
#define EXPORTING_try2 1
#include "try2.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_try2_C_API
#define LIB_try2_C_API /* No special import/export declaration */
#endif
LIB_try2_C_API
bool MW_CALL_CONV try2InitializeWithHandlers(
mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler)
{
int bResult = 0;
if (_mcr_inst != NULL)
return true;
if (!mclmcrInitialize())
return false;
if (!GetModuleFileName(GetModuleHandle("try2"), 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_try2_C_API
bool MW_CALL_CONV try2Initialize(void)
{
return try2InitializeWithHandlers(mclDefaultErrorHandler, mclDefaultPrintHandler);
}
LIB_try2_C_API
void MW_CALL_CONV try2Terminate(void)
{
if (_mcr_inst != NULL)
mclTerminateInstance(&_mcr_inst);
}
LIB_try2_C_API
void MW_CALL_CONV try2PrintStackTrace(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_try2_C_API
bool MW_CALL_CONV mlxShoes(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
return mclFeval(_mcr_inst, "shoes", nlhs, plhs, nrhs, prhs);
}
LIB_try2_CPP_API
void MW_CALL_CONV shoes(const mwArray& imagepath)
{
mclcppMlfFeval(_mcr_inst, "shoes", 0, 0, 1, &imagepath);
}
Когда я пытаюсь запустить его, он не может инициализировать try2Initialize (). Какое может быть решение? Это консольное приложение win32.
Я использую Visual Studio 2010, MATLAB R2012b-64bit, и моя ОС — Windows 7.
P> S. Извините за лишний код, просто хочу сообщить подробности программы.
Я не уверен насчет R2012b и 64-битной версии. Я использую r2012a.
Но я думаю, что могу поделиться своими историями. Я все время использую deploytool, поэтому сгенерированный метод называется вашим методом: try2Initialize ();
Недавно я перешел на команду mcc и обнаружил в файле c имя метода, которое осталось прежним, но если я проверю имя метода в файле dll с помощью стороннего инструмента, такого как dll export viewer:http://www.nirsoft.net/utils/dll_export_viewer.html
Фактическое имя метода — _try2Initialize (); впереди немного _
Поэтому я предлагаю вам проверить имя метода, если у вас заканчивается выбор.
Удачи!
Других решений пока нет …