簡體   English   中英

Matlab無法正確初始化C ++共享庫

[英]Matlab could not initialize C++ shared library properly

我正在嘗試使用Visual C ++中的MATLAB中通過deploytool生成的C ++共享庫。 我收到一個錯誤:無法正確初始化庫。

我跟着:

http://www.mathworks.com/support/solutions/zh-CN/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;
}

從MATLAB生成的try2.cpp包裝文件是

//
  // 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。 很抱歉,多余的代碼只想提供程序的詳細信息。

我不確定R2012b和64位版本。 我正在使用r2012a。 但是我想我可以分享我的故事。 我一直都使用deploytool,所以生成的方法被命名為您的方法:try2Initialize(); 最近我更改為mcc命令,我發現c文件中的方法名稱仍然相同,但是如果我使用3種第三方工具(例如dll導出查看器)檢查dll文件中的方法名稱: http:// www。 nirsoft.net/utils/dll_export_viewer.html

實際的方法名稱是_try2Initialize();。 前面有一點

因此,如果您用盡了選項,建議您檢查方法名稱。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM