Nano Hash - криптовалюты, майнинг, программирование

Matlab не может правильно инициализировать разделяемую библиотеку C++

Я пытаюсь использовать общую библиотеку С++, созданную с помощью инструмента развертывания в MATLAB в Visual С++. Я получаю сообщение об ошибке: Не удалось правильно инициализировать библиотеку.

Я последовал за:

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. Извините за лишний код, просто хочу подробно рассказать о программе.


Ответы:


1

Я не уверен насчет R2012b и 64-битной версии. Я использую r2012a. Но я думаю, что могу поделиться своими историями. Я использую deploytool все время, поэтому сгенерированный метод называется вашим методом: try2Initialize(); Недавно я перешел на команду mcc, я нашел в файле c, имя метода остается прежним, но если я проверю имя метода в файле dll с помощью какого-либо стороннего инструмента, например средства просмотра dll export:http://www.nirsoft.net/utils/dll_export_viewer.html

Фактическое имя метода — _try2Initialize(); впереди немного _

Поэтому я предлагаю вам проверить имя метода, если у вас закончились варианты. Удачи!

28.11.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..